pkscreener 0.46.20250214.716__cp310-cp310-macosx_10_9_x86_64.whl → 0.46.20250214.718__cp310-cp310-macosx_10_9_x86_64.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.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/README.txt +5 -5
  2. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/MarketMonitor.py +13 -6
  3. pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/__init__.py +1 -0
  4. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/pkscreenerbot.py +73 -3
  5. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/requirements.txt +2 -2
  6. {pkscreener-0.46.20250214.716.dist-info → pkscreener-0.46.20250214.718.dist-info}/METADATA +9 -9
  7. pkscreener-0.46.20250214.718.dist-info/RECORD +58 -0
  8. pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/__init__.py +0 -1
  9. pkscreener-0.46.20250214.716.dist-info/RECORD +0 -58
  10. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/Disclaimer.txt +0 -0
  11. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/LICENSE-Others.txt +0 -0
  12. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/LICENSE.txt +0 -0
  13. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/LogoWM.txt +0 -0
  14. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/__init__.py +0 -0
  15. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/ArtTexts.py +0 -0
  16. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/AssetsManager.py +0 -0
  17. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/Backtest.py +0 -0
  18. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/Barometer.py +0 -0
  19. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/BaseScreeningStatistics.py +0 -0
  20. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/CandlePatterns.py +0 -0
  21. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/Changelog.py +0 -0
  22. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/ConfigManager.py +0 -0
  23. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/ConsoleMenuUtility.py +0 -0
  24. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/ConsoleUtility.py +0 -0
  25. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/Fetcher.py +0 -0
  26. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/GlobalStore.py +0 -0
  27. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/ImageUtility.py +0 -0
  28. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/MarketStatus.py +0 -0
  29. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/MenuOptions.py +0 -0
  30. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/Messenger.py +0 -0
  31. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/OtaUpdater.py +0 -0
  32. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/PKAnalytics.py +0 -0
  33. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/PKDataService.py +0 -0
  34. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/PKDemoHandler.py +0 -0
  35. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/PKMarketOpenCloseAnalyser.py +0 -0
  36. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/PKPremiumHandler.py +0 -0
  37. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/PKScanRunner.py +0 -0
  38. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/PKScheduledTaskProgress.py +0 -0
  39. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/PKScheduler.py +0 -0
  40. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/PKSpreadsheets.py +0 -0
  41. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/PKTask.py +0 -0
  42. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/PKUserRegistration.py +0 -0
  43. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/Pktalib.py +0 -0
  44. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/Portfolio.py +0 -0
  45. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/PortfolioXRay.py +0 -0
  46. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/ScreeningStatistics.py +0 -0
  47. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/StockScreener.py +0 -0
  48. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/StockSentiment.py +0 -0
  49. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/UserMenuChoicesHandler.py +0 -0
  50. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/Utility.py +0 -0
  51. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/WorkflowManager.py +0 -0
  52. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/classes/keys.py +0 -0
  53. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/courbd.ttf +0 -0
  54. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/globals.py +0 -0
  55. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/pkscreener.ini +0 -0
  56. {pkscreener-0.46.20250214.716.data → pkscreener-0.46.20250214.718.data}/purelib/pkscreener/pkscreenercli.py +0 -0
  57. {pkscreener-0.46.20250214.716.dist-info → pkscreener-0.46.20250214.718.dist-info}/LICENSE +0 -0
  58. {pkscreener-0.46.20250214.716.dist-info → pkscreener-0.46.20250214.718.dist-info}/WHEEL +0 -0
  59. {pkscreener-0.46.20250214.716.dist-info → pkscreener-0.46.20250214.718.dist-info}/entry_points.txt +0 -0
  60. {pkscreener-0.46.20250214.716.dist-info → pkscreener-0.46.20250214.718.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.715/pkscreenercli.exe
331
+ [Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.717/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.715/pkscreenercli_x64.bin
333
+ [Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.717/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.715/pkscreenercli_arm64.bin
335
+ [Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.717/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.715/pkscreenercli_x64.run
337
+ [Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.717/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.715/pkscreenercli_arm64.run
339
+ [Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.717/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
@@ -54,7 +54,7 @@ class MarketMonitor(SingletonMixin, metaclass=SingletonType):
54
54
  self.alertOptions = alertOptions
55
55
  self.hiddenColumns = ""
56
56
  self.alertStocks = []
57
- self.firstAlertTriggered = False
57
+ self.alertedStocks = {}
58
58
  self.pinnedIntervalWaitSeconds = pinnedIntervalWaitSeconds
59
59
  # self.monitorNames = {}
60
60
  # We are going to present the dataframes in a 3x3 matrix with limited set of columns
@@ -66,7 +66,10 @@ class MarketMonitor(SingletonMixin, metaclass=SingletonType):
66
66
  self.maxNumResultsPerRow = maxNumResultsPerRow
67
67
  maxColIndex = self.maxNumColsInEachResult * self.maxNumResultsPerRow - 1
68
68
  self.lines = 0
69
+ monIndex = 0
69
70
  for monitorKey in self.monitors:
71
+ self.alertedStocks[str(monIndex)] = []
72
+ monIndex += 1
70
73
  self.monitorPositions[monitorKey] = [rowIndex,colIndex]
71
74
  # self.monitorNames[monitorKey] = ""
72
75
  colIndex += self.maxNumColsInEachResult
@@ -96,6 +99,8 @@ class MarketMonitor(SingletonMixin, metaclass=SingletonType):
96
99
 
97
100
  def saveMonitorResultStocks(self, results_df):
98
101
  try:
102
+ if len(self.alertedStocks.keys()) < self.monitorIndex+1: # for pytests
103
+ self.alertedStocks[str(self.monitorIndex)] = []
99
104
  self.alertStocks = []
100
105
  lastSavedResults = self.monitorResultStocks[str(self.monitorIndex)]
101
106
  lastSavedResults = lastSavedResults.split(",")
@@ -114,9 +119,12 @@ class MarketMonitor(SingletonMixin, metaclass=SingletonType):
114
119
  addedStocks = list(set(prevOutput_results.split(',')) - set(lastSavedResults)) # Elements in new df but not in the saved df
115
120
  if len(self.alertStocks) != len(addedStocks) and len(addedStocks) > 0:
116
121
  self.alertStocks = addedStocks
117
- diffAlerts = list(set(self.alertStocks) - set(addedStocks))
122
+ diffAlerts = list(set(self.alertStocks) - set(self.alertedStocks[str(self.monitorIndex)]))
118
123
  if len(diffAlerts) > 0:
119
- self.alertStocks = addedStocks
124
+ self.alertStocks = diffAlerts
125
+ self.alertedStocks[str(self.monitorIndex)].extend(diffAlerts)
126
+ else:
127
+ self.alertStocks = []
120
128
  if len(addedStocks) > 0:
121
129
  self.monitorResultStocks[str(self.monitorIndex)] = prevOutput_results
122
130
 
@@ -268,11 +276,11 @@ class MarketMonitor(SingletonMixin, metaclass=SingletonType):
268
276
  if telegram:
269
277
  self.updateIfRunningInTelegramBotMode(screenOptions, chosenMenu, dbTimestamp, telegram, telegram_df)
270
278
  else:
271
- if ((screenOptions in self.alertOptions and numRecords > 3) or len(self.alertStocks) > 0 or not self.firstAlertTriggered): # Alert conditions met? Sound alert!
279
+ if ((screenOptions in self.alertOptions and numRecords > 3) or len(self.alertStocks) > 0): # Alert conditions met? Sound alert!
272
280
  # numRecords is actually new lines. Top 3 lines are only headers
273
281
  if telegram_df is not None:
274
282
  telegram_df.reset_index(inplace=True)
275
- notify_df = telegram_df[telegram_df["Stock"].isin(self.alertStocks)] if self.firstAlertTriggered else telegram_df
283
+ notify_df = telegram_df[telegram_df["Stock"].isin(self.alertStocks)]
276
284
  notify_df = notify_df[["Stock","LTP","Ch%","Vol"]].head(50)
277
285
  if len(notify_df) > 0:
278
286
  notify_output = self.updateIfRunningInTelegramBotMode(screenOptions, chosenMenu, dbTimestamp, False, notify_df,maxcolwidths=None)
@@ -280,7 +288,6 @@ class MarketMonitor(SingletonMixin, metaclass=SingletonType):
280
288
  from PKDevTools.classes.pubsub.publisher import PKUserService
281
289
  from PKDevTools.classes.pubsub.subscriber import notification_service
282
290
  PKUserService().notify_user(scannerID=self.getScanOptionName(screenOptions),notification=notify_output)
283
- self.firstAlertTriggered = True
284
291
  # notify_df = self.monitor_df.reindex(self.alertStocks) # Includes missing stocks, if any. Returns NaN for such cases
285
292
  Utility.tools.alertSound(beeps=5)
286
293
  sleep(self.pinnedIntervalWaitSeconds)
@@ -0,0 +1 @@
1
+ VERSION='0.46.20250214.718'
@@ -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
 
@@ -2114,6 +2183,7 @@ def runpkscreenerbot(availability=True) -> None:
2114
2183
  CallbackQueryHandler(Level2, pattern="^" + str("CP_")),
2115
2184
  CallbackQueryHandler(subscribeToScannerAlerts, pattern="^" + str("SUB_")),
2116
2185
  CallbackQueryHandler(viewSubscriptionOptions, pattern="^" + str("VS_")),
2186
+ CallbackQueryHandler(cancelAlertSubscription, pattern="^" + str("CAN_")),
2117
2187
  # CallbackQueryHandler(Level2, pattern="^" + str("CG_")),
2118
2188
  CallbackQueryHandler(end, pattern="^" + str("CZ") + "$"),
2119
2189
  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.1
2
2
  Name: pkscreener
3
- Version: 0.46.20250214.716
3
+ Version: 0.46.20250214.718
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.716.zip
6
+ Download-URL: https://github.com/pkjmesra/pkscreener/archive/v0.46.20250214.718.zip
7
7
  Author: pkjmesra
8
8
  Author-email: pkjmesra@gmail.com
9
9
  License: OSI Approved (MIT)
@@ -33,8 +33,8 @@ Requires-Dist: pandas
33
33
  Requires-Dist: pandas-ta
34
34
  Requires-Dist: pefile <2024.8.26,>=2023.2.7
35
35
  Requires-Dist: Pillow
36
- Requires-Dist: PKDevTools >=0.13.20250126.233
37
- Requires-Dist: PKNSETools >=0.1.20250122.137
36
+ Requires-Dist: PKDevTools >=0.13.20250126.235
37
+ Requires-Dist: PKNSETools >=0.1.20250122.138
38
38
  Requires-Dist: Pyarrow
39
39
  Requires-Dist: pyppeteer
40
40
  Requires-Dist: pytz
@@ -380,15 +380,15 @@ After you have finished the run, go to that copied path, zip the contents of the
380
380
  [MADE-IN-INDIA-badge]: https://img.shields.io/badge/MADE%20WITH%20%E2%9D%A4%20IN-INDIA-orange
381
381
  [MADE-IN-INDIA]: https://en.wikipedia.org/wiki/India
382
382
  [Windows-badge]: https://img.shields.io/badge/Windows-0078D6?logo=windows&logoColor=white
383
- [Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.715/pkscreenercli.exe
383
+ [Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.717/pkscreenercli.exe
384
384
  [Linux-badge_x64]: https://img.shields.io/badge/Linux(x64)-FCC624?logo=linux&logoColor=black
385
- [Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.715/pkscreenercli_x64.bin
385
+ [Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.717/pkscreenercli_x64.bin
386
386
  [Linux-badge_arm64]: https://img.shields.io/badge/Linux(arm64)-FCC624?logo=linux&logoColor=black
387
- [Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.715/pkscreenercli_arm64.bin
387
+ [Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.717/pkscreenercli_arm64.bin
388
388
  [Mac OS-badge_x64]: https://img.shields.io/badge/mac%20os(x64)-D3D3D3?logo=apple&logoColor=000000
389
- [Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.715/pkscreenercli_x64.run
389
+ [Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.717/pkscreenercli_x64.run
390
390
  [Mac OS-badge_arm64]: https://img.shields.io/badge/mac%20os(arm64)-D3D3D3?logo=apple&logoColor=000000
391
- [Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.715/pkscreenercli_arm64.run
391
+ [Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.717/pkscreenercli_arm64.run
392
392
  [GitHub release (latest by date)-badge]: https://img.shields.io/github/v/release/pkjmesra/PKScreener
393
393
  [GitHub release (latest by date)]: https://github.com/pkjmesra/PKScreener/releases/latest
394
394
  [pypi-badge]: https://img.shields.io/pypi/v/pkscreener.svg?style=flat-square
@@ -0,0 +1,58 @@
1
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/Disclaimer.txt,sha256=kBZQSQCFfL2kc1bijXWndZzkjMTtnpH_B7XtDPPMcuw,1396
2
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/LICENSE-Others.txt,sha256=WBslRYLBoqYg-vr25sS1c_UI7cuUnsGk0nIQLBzTWEE,271830
3
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/LICENSE.txt,sha256=CdnyGrl-xRYX67ZkdERZWHr6BlTxOyg8Z8sK1XQ5Xsg,1078
4
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/LogoWM.txt,sha256=7Njnavpy_FKY4Iwbzv1JqsYMcOdkDSKAKXP3SAItKV0,14868
5
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/README.txt,sha256=zaXpAy3bI9KFJQt0v_98G0_OTVBMu2KZHnRLkiyg4Bg,32701
6
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/__init__.py,sha256=aZ62qYACxsU8m8_5JkzNzos1lVFNcMGPRMgeddnUUiQ,1633
7
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/courbd.ttf,sha256=SKpnp-BRs7AZcdI83nencS3Q7xe0anbbP1YMOxLlEhU,791436
8
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/globals.py,sha256=bIj3LBnbiGvVYidOF0sohg19jHTEkAavrGYaYFyBPhM,240829
9
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/pkscreener.ini,sha256=QKs6j4qhyH37L_MdG3ztAIwgqs4c3qihuqDIoex-V2g,2391
10
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/pkscreenerbot.py,sha256=br4hCHdOYqck0nO4FS2ApQ43wH8DydAEFja0ExOovIM,111801
11
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/pkscreenercli.py,sha256=WEVXfcZdeogWZBY3CWtRYyFrmQa5BEEZedKLlMwCM5U,56999
12
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/requirements.txt,sha256=FN4W519f9djXoatr7VpWIbrwQUMmHvMvXO54_0SG2w8,1457
13
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/ArtTexts.py,sha256=LZ8ynyS8woliv8bM9Nq4aU0VCoJDJU0FgZk8V5zYPmg,19504
14
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/AssetsManager.py,sha256=SutbAZ4JiGhzN0tzfa9vNpHdW6alSL67Jz-knPPcqBw,33706
15
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/Backtest.py,sha256=wobBQgqVQhFNZlyJ2hgMXQqofrICc_3F0I5D66DUvGI,10530
16
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/Barometer.py,sha256=WPrgtIXb1nIbb-FnuRs-yvOQ5baNQRBgUR_zWg1moxk,9464
17
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/BaseScreeningStatistics.py,sha256=u5t1wf-HsZ8xEtprON55ehIR3F2LNNq8LvwgIrhYRmU,3000
18
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/CandlePatterns.py,sha256=gaswU2OeDa3JXjEafR2clUpKW5v8_1_tJuNPuTWsAss,17066
19
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/Changelog.py,sha256=vUOpca28OACNhavAmjBm4xco3u6fcHqWlnlmCJqO5Lk,1469
20
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/ConfigManager.py,sha256=THcfBgua5hr1Pv7AwEDBu2yurCNteGM04jY3Fr_MeBg,53565
21
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/ConsoleMenuUtility.py,sha256=fyR7dEsAaEWEe5SyaVgwLPdU4h4pI8SozUhsPZXShpg,10037
22
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/ConsoleUtility.py,sha256=TrEnTT4pmsBpEYdwD2oAtNqNG_drPe1LVkhthP2540I,12096
23
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/Fetcher.py,sha256=WWX9_NO3JTw6_1Z9SqPm4Nj-4Uy_4PPYEMVyD5FLnVo,12336
24
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/GlobalStore.py,sha256=IzoYMybXpVVf6YwZi7j34rP-hNd7sMened8TAMu_-A8,3709
25
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/ImageUtility.py,sha256=mgJUzjrOKQ1mYV5P_ylhBnaF7ZgOO6ogjy22Rt49TNI,37032
26
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/MarketMonitor.py,sha256=GQOPLuUhgcrnVa0mI8ZvXqQ4vPFW00FHW_vMfICnko8,22079
27
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/MarketStatus.py,sha256=dNg8znbRpt7ID3U_1nmclD4zSLtveJeYeRbS0l6HLtE,3737
28
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/MenuOptions.py,sha256=iZb0zBs7lcP60cmuP7Z5xmXfNtTFcFH6ZWOuoileErE,64552
29
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/Messenger.py,sha256=peyY-YiqdC1bp-3DlJXILRa9HGYbqGVzf1wil0fYv98,8396
30
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/OtaUpdater.py,sha256=_7-nFAC-vAcmZ1Nwi5g5tfp7hKQQPuLUnBCOzrwC39g,13491
31
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/PKAnalytics.py,sha256=_X-2OFw2yQVmXlEIRsnBVNy9fhYyxqt0BOqADD4v08U,5246
32
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/PKDataService.py,sha256=BipM8Z4rS6h12cF6VWv_u4Z8ee7psMFd1yUojejW1Ag,3393
33
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/PKDemoHandler.py,sha256=r4KrZF8TaOu1J0nu8sUsgWEvnbndboWQQvz69GOy1Fk,2207
34
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/PKMarketOpenCloseAnalyser.py,sha256=T7S0DRv4Tqg77S5CyTWQUgpIAtx0NEtSVAplkynS2YM,33833
35
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/PKPremiumHandler.py,sha256=r16-u9fyc0ftgnSnZnz-JusTfEzyQIyKkvgbPuSd7W4,5611
36
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/PKScanRunner.py,sha256=EPLo2euBMfA9omnqrr5pXv2h9KzTcPZM-PXRFI26LSo,26791
37
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/PKScheduledTaskProgress.py,sha256=h19ZuxoalB50pnZjntFh12b9mBozvMqhKYq6TL18vo4,1657
38
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/PKScheduler.py,sha256=qThoz0yXLmHEWAiD_TdkIrzJb37b_m830JJFrkN1Tio,8814
39
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/PKSpreadsheets.py,sha256=1I7YGGPPY879K5JeTZ_d1FNCpjloh6TZrx91JlwT20o,8298
40
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/PKTask.py,sha256=4q87uD2cXvp0AbP6I73xPP39F0mfnpHQutsxxqpnxJM,1867
41
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/PKUserRegistration.py,sha256=ZbnPzgvT5Je9X0Dm6bewSp8u7Fj_szNucaYnit_AtCg,11465
42
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/Pktalib.py,sha256=xketnpMVDGHOFg47LFavaU-agWy370VanYWyzzuLY8c,33386
43
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/Portfolio.py,sha256=JZ93n3Zk9nkSFaX-lHyQiFnavHVmHPFoy-L_4gugj54,13895
44
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/PortfolioXRay.py,sha256=4MjXqBAVUlfN4w5tTmgEnQGMoy0hFu_uaVgrmai1fN4,48339
45
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/ScreeningStatistics.py,sha256=LteoSl8r4mI2GMvVKAmdmzMe-Axy3jeyNAaIsgp48s4,221101
46
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/StockScreener.py,sha256=F0SWa1DSTgYdSWnkPTR9kmOKgHLtaqNMCtJP8yZkDnE,67252
47
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/StockSentiment.py,sha256=WL7TBAHDSIN5cgZ9uTbbEFnUPo4G-YIzEv16RpPGaro,3546
48
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/UserMenuChoicesHandler.py,sha256=_fTCscTLEjoU-n12V9237uDN6Jf8nGCvGdBVkpD3Ap4,4947
49
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/Utility.py,sha256=Cn_QrVH40rQWkHW2e2NolE0b18qszvGXfVLdwAqD7sM,13562
50
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/WorkflowManager.py,sha256=d0_QiVfai65axe4Oi_h2XUkPyx_wWfiofZd_gMtNAwY,5632
51
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/__init__.py,sha256=K7IWpgyLVwEQTUhJXK35poUNOFheF_w5e4jBdM113EY,28
52
+ pkscreener-0.46.20250214.718.data/purelib/pkscreener/classes/keys.py,sha256=LQq_t1lSh0x4TbRCIDhoCil3xctgLLeVk5f2vgrl1tk,6789
53
+ pkscreener-0.46.20250214.718.dist-info/LICENSE,sha256=CdnyGrl-xRYX67ZkdERZWHr6BlTxOyg8Z8sK1XQ5Xsg,1078
54
+ pkscreener-0.46.20250214.718.dist-info/METADATA,sha256=r7JHWShxiYi0-KH5UEWwulE8T6RJiffn5DeWquGJm8o,34391
55
+ pkscreener-0.46.20250214.718.dist-info/WHEEL,sha256=qW9xlwewyQBufEUzmM-8CIjZ7fR659LOSrcgouui4Z4,111
56
+ pkscreener-0.46.20250214.718.dist-info/entry_points.txt,sha256=Pm30xm4sU7YFtFJUC-Te8VlqOvYAvWKFFA5AfQE0xGY,120
57
+ pkscreener-0.46.20250214.718.dist-info/top_level.txt,sha256=oIfcPPw58Q4KU-GDqp25dXbrtvxYXJBCo_em6i5aVvY,11
58
+ pkscreener-0.46.20250214.718.dist-info/RECORD,,
@@ -1 +0,0 @@
1
- VERSION='0.46.20250214.716'
@@ -1,58 +0,0 @@
1
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/Disclaimer.txt,sha256=kBZQSQCFfL2kc1bijXWndZzkjMTtnpH_B7XtDPPMcuw,1396
2
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/LICENSE-Others.txt,sha256=WBslRYLBoqYg-vr25sS1c_UI7cuUnsGk0nIQLBzTWEE,271830
3
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/LICENSE.txt,sha256=CdnyGrl-xRYX67ZkdERZWHr6BlTxOyg8Z8sK1XQ5Xsg,1078
4
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/LogoWM.txt,sha256=7Njnavpy_FKY4Iwbzv1JqsYMcOdkDSKAKXP3SAItKV0,14868
5
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/README.txt,sha256=Sdojt4vgUX-n5yfkNhqDCSyeDWrQDUF-vs_einfsIdo,32701
6
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/__init__.py,sha256=aZ62qYACxsU8m8_5JkzNzos1lVFNcMGPRMgeddnUUiQ,1633
7
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/courbd.ttf,sha256=SKpnp-BRs7AZcdI83nencS3Q7xe0anbbP1YMOxLlEhU,791436
8
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/globals.py,sha256=bIj3LBnbiGvVYidOF0sohg19jHTEkAavrGYaYFyBPhM,240829
9
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/pkscreener.ini,sha256=QKs6j4qhyH37L_MdG3ztAIwgqs4c3qihuqDIoex-V2g,2391
10
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/pkscreenerbot.py,sha256=u6WovcJo97PAmoMfZYMmooj9SClH1OLeRPprvxcf0_0,107840
11
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/pkscreenercli.py,sha256=WEVXfcZdeogWZBY3CWtRYyFrmQa5BEEZedKLlMwCM5U,56999
12
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/requirements.txt,sha256=kgq4lh06feiOI8JlIM3PjZlnO6DW1RsM9q-tXeXjtNE,1457
13
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/ArtTexts.py,sha256=LZ8ynyS8woliv8bM9Nq4aU0VCoJDJU0FgZk8V5zYPmg,19504
14
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/AssetsManager.py,sha256=SutbAZ4JiGhzN0tzfa9vNpHdW6alSL67Jz-knPPcqBw,33706
15
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/Backtest.py,sha256=wobBQgqVQhFNZlyJ2hgMXQqofrICc_3F0I5D66DUvGI,10530
16
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/Barometer.py,sha256=WPrgtIXb1nIbb-FnuRs-yvOQ5baNQRBgUR_zWg1moxk,9464
17
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/BaseScreeningStatistics.py,sha256=u5t1wf-HsZ8xEtprON55ehIR3F2LNNq8LvwgIrhYRmU,3000
18
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/CandlePatterns.py,sha256=gaswU2OeDa3JXjEafR2clUpKW5v8_1_tJuNPuTWsAss,17066
19
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/Changelog.py,sha256=vUOpca28OACNhavAmjBm4xco3u6fcHqWlnlmCJqO5Lk,1469
20
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/ConfigManager.py,sha256=THcfBgua5hr1Pv7AwEDBu2yurCNteGM04jY3Fr_MeBg,53565
21
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/ConsoleMenuUtility.py,sha256=fyR7dEsAaEWEe5SyaVgwLPdU4h4pI8SozUhsPZXShpg,10037
22
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/ConsoleUtility.py,sha256=TrEnTT4pmsBpEYdwD2oAtNqNG_drPe1LVkhthP2540I,12096
23
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/Fetcher.py,sha256=WWX9_NO3JTw6_1Z9SqPm4Nj-4Uy_4PPYEMVyD5FLnVo,12336
24
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/GlobalStore.py,sha256=IzoYMybXpVVf6YwZi7j34rP-hNd7sMened8TAMu_-A8,3709
25
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/ImageUtility.py,sha256=mgJUzjrOKQ1mYV5P_ylhBnaF7ZgOO6ogjy22Rt49TNI,37032
26
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/MarketMonitor.py,sha256=LFCJhmS90nymwdnBk9mdrz23krR3hosH2XQ6NutRtZQ,21816
27
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/MarketStatus.py,sha256=dNg8znbRpt7ID3U_1nmclD4zSLtveJeYeRbS0l6HLtE,3737
28
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/MenuOptions.py,sha256=iZb0zBs7lcP60cmuP7Z5xmXfNtTFcFH6ZWOuoileErE,64552
29
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/Messenger.py,sha256=peyY-YiqdC1bp-3DlJXILRa9HGYbqGVzf1wil0fYv98,8396
30
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/OtaUpdater.py,sha256=_7-nFAC-vAcmZ1Nwi5g5tfp7hKQQPuLUnBCOzrwC39g,13491
31
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/PKAnalytics.py,sha256=_X-2OFw2yQVmXlEIRsnBVNy9fhYyxqt0BOqADD4v08U,5246
32
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/PKDataService.py,sha256=BipM8Z4rS6h12cF6VWv_u4Z8ee7psMFd1yUojejW1Ag,3393
33
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/PKDemoHandler.py,sha256=r4KrZF8TaOu1J0nu8sUsgWEvnbndboWQQvz69GOy1Fk,2207
34
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/PKMarketOpenCloseAnalyser.py,sha256=T7S0DRv4Tqg77S5CyTWQUgpIAtx0NEtSVAplkynS2YM,33833
35
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/PKPremiumHandler.py,sha256=r16-u9fyc0ftgnSnZnz-JusTfEzyQIyKkvgbPuSd7W4,5611
36
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/PKScanRunner.py,sha256=EPLo2euBMfA9omnqrr5pXv2h9KzTcPZM-PXRFI26LSo,26791
37
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/PKScheduledTaskProgress.py,sha256=h19ZuxoalB50pnZjntFh12b9mBozvMqhKYq6TL18vo4,1657
38
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/PKScheduler.py,sha256=qThoz0yXLmHEWAiD_TdkIrzJb37b_m830JJFrkN1Tio,8814
39
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/PKSpreadsheets.py,sha256=1I7YGGPPY879K5JeTZ_d1FNCpjloh6TZrx91JlwT20o,8298
40
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/PKTask.py,sha256=4q87uD2cXvp0AbP6I73xPP39F0mfnpHQutsxxqpnxJM,1867
41
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/PKUserRegistration.py,sha256=ZbnPzgvT5Je9X0Dm6bewSp8u7Fj_szNucaYnit_AtCg,11465
42
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/Pktalib.py,sha256=xketnpMVDGHOFg47LFavaU-agWy370VanYWyzzuLY8c,33386
43
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/Portfolio.py,sha256=JZ93n3Zk9nkSFaX-lHyQiFnavHVmHPFoy-L_4gugj54,13895
44
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/PortfolioXRay.py,sha256=4MjXqBAVUlfN4w5tTmgEnQGMoy0hFu_uaVgrmai1fN4,48339
45
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/ScreeningStatistics.py,sha256=LteoSl8r4mI2GMvVKAmdmzMe-Axy3jeyNAaIsgp48s4,221101
46
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/StockScreener.py,sha256=F0SWa1DSTgYdSWnkPTR9kmOKgHLtaqNMCtJP8yZkDnE,67252
47
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/StockSentiment.py,sha256=WL7TBAHDSIN5cgZ9uTbbEFnUPo4G-YIzEv16RpPGaro,3546
48
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/UserMenuChoicesHandler.py,sha256=_fTCscTLEjoU-n12V9237uDN6Jf8nGCvGdBVkpD3Ap4,4947
49
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/Utility.py,sha256=Cn_QrVH40rQWkHW2e2NolE0b18qszvGXfVLdwAqD7sM,13562
50
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/WorkflowManager.py,sha256=d0_QiVfai65axe4Oi_h2XUkPyx_wWfiofZd_gMtNAwY,5632
51
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/__init__.py,sha256=RKCuCWX5EoEWDwiTjiaJtbcL_tu8vFQnrlxK-Kt9zW8,28
52
- pkscreener-0.46.20250214.716.data/purelib/pkscreener/classes/keys.py,sha256=LQq_t1lSh0x4TbRCIDhoCil3xctgLLeVk5f2vgrl1tk,6789
53
- pkscreener-0.46.20250214.716.dist-info/LICENSE,sha256=CdnyGrl-xRYX67ZkdERZWHr6BlTxOyg8Z8sK1XQ5Xsg,1078
54
- pkscreener-0.46.20250214.716.dist-info/METADATA,sha256=Pzl1BEBUn2eyV2qh8mWeLJzzdVRa-rBLYZQzD8VgGRQ,34391
55
- pkscreener-0.46.20250214.716.dist-info/WHEEL,sha256=qW9xlwewyQBufEUzmM-8CIjZ7fR659LOSrcgouui4Z4,111
56
- pkscreener-0.46.20250214.716.dist-info/entry_points.txt,sha256=Pm30xm4sU7YFtFJUC-Te8VlqOvYAvWKFFA5AfQE0xGY,120
57
- pkscreener-0.46.20250214.716.dist-info/top_level.txt,sha256=oIfcPPw58Q4KU-GDqp25dXbrtvxYXJBCo_em6i5aVvY,11
58
- pkscreener-0.46.20250214.716.dist-info/RECORD,,