pkscreener 0.46.20250212.704__cp312-cp312-manylinux2014_x86_64.whl → 0.46.20250213.705__cp312-cp312-manylinux2014_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.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/README.txt +5 -5
  2. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/MarketMonitor.py +71 -35
  3. pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/__init__.py +1 -0
  4. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/globals.py +3 -0
  5. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/requirements.txt +1 -1
  6. {pkscreener-0.46.20250212.704.dist-info → pkscreener-0.46.20250213.705.dist-info}/METADATA +8 -8
  7. pkscreener-0.46.20250213.705.dist-info/RECORD +58 -0
  8. pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/__init__.py +0 -1
  9. pkscreener-0.46.20250212.704.dist-info/RECORD +0 -58
  10. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/Disclaimer.txt +0 -0
  11. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/LICENSE-Others.txt +0 -0
  12. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/LICENSE.txt +0 -0
  13. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/LogoWM.txt +0 -0
  14. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/__init__.py +0 -0
  15. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/ArtTexts.py +0 -0
  16. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/AssetsManager.py +0 -0
  17. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/Backtest.py +0 -0
  18. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/Barometer.py +0 -0
  19. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/BaseScreeningStatistics.py +0 -0
  20. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/CandlePatterns.py +0 -0
  21. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/Changelog.py +0 -0
  22. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/ConfigManager.py +0 -0
  23. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/ConsoleMenuUtility.py +0 -0
  24. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/ConsoleUtility.py +0 -0
  25. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/Fetcher.py +0 -0
  26. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/GlobalStore.py +0 -0
  27. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/ImageUtility.py +0 -0
  28. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/MarketStatus.py +0 -0
  29. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/MenuOptions.py +0 -0
  30. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/Messenger.py +0 -0
  31. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/OtaUpdater.py +0 -0
  32. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/PKAnalytics.py +0 -0
  33. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/PKDataService.py +0 -0
  34. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/PKDemoHandler.py +0 -0
  35. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/PKMarketOpenCloseAnalyser.py +0 -0
  36. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/PKPremiumHandler.py +0 -0
  37. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/PKScanRunner.py +0 -0
  38. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/PKScheduledTaskProgress.py +0 -0
  39. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/PKScheduler.py +0 -0
  40. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/PKSpreadsheets.py +0 -0
  41. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/PKTask.py +0 -0
  42. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/PKUserRegistration.py +0 -0
  43. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/Pktalib.py +0 -0
  44. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/Portfolio.py +0 -0
  45. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/PortfolioXRay.py +0 -0
  46. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/ScreeningStatistics.py +0 -0
  47. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/StockScreener.py +0 -0
  48. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/StockSentiment.py +0 -0
  49. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/UserMenuChoicesHandler.py +0 -0
  50. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/Utility.py +0 -0
  51. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/WorkflowManager.py +0 -0
  52. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/classes/keys.py +0 -0
  53. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/courbd.ttf +0 -0
  54. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/pkscreener.ini +0 -0
  55. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/pkscreenerbot.py +0 -0
  56. {pkscreener-0.46.20250212.704.data → pkscreener-0.46.20250213.705.data}/purelib/pkscreener/pkscreenercli.py +0 -0
  57. {pkscreener-0.46.20250212.704.dist-info → pkscreener-0.46.20250213.705.dist-info}/LICENSE +0 -0
  58. {pkscreener-0.46.20250212.704.dist-info → pkscreener-0.46.20250213.705.dist-info}/WHEEL +0 -0
  59. {pkscreener-0.46.20250212.704.dist-info → pkscreener-0.46.20250213.705.dist-info}/entry_points.txt +0 -0
  60. {pkscreener-0.46.20250212.704.dist-info → pkscreener-0.46.20250213.705.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.20250210.703/pkscreenercli.exe
331
+ [Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250212.704/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.20250210.703/pkscreenercli_x64.bin
333
+ [Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250212.704/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.20250210.703/pkscreenercli_arm64.bin
335
+ [Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250212.704/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.20250210.703/pkscreenercli_x64.run
337
+ [Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250212.704/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.20250210.703/pkscreenercli_arm64.run
339
+ [Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250212.704/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,6 +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
58
  self.pinnedIntervalWaitSeconds = pinnedIntervalWaitSeconds
58
59
  # self.monitorNames = {}
59
60
  # We are going to present the dataframes in a 3x3 matrix with limited set of columns
@@ -127,23 +128,42 @@ class MarketMonitor(SingletonMixin, metaclass=SingletonType):
127
128
  if self.isPinnedSingleMonitorMode:
128
129
  screen_monitor_df = screen_monitor_df[screen_monitor_df.columns[:14]]
129
130
  self.monitor_df = screen_monitor_df
130
- else:
131
- screen_monitor_df.reset_index(inplace=True)
132
- screen_monitor_df = screen_monitor_df[["Stock", "LTP", "%Chng","52Wk-H","RSI/i" if "RSI/i" in screen_monitor_df.columns else "RSI","Volume"]].head(self.maxNumRowsInEachResult-1)
133
- # Import Utility here since Utility has dependency on PKScheduler which in turn has dependency on
134
- # multiprocessing, which behaves erratically if imported at the top.
135
- screen_monitor_df.loc[:, "%Chng"] = screen_monitor_df.loc[:, "%Chng"].astype(str).apply(
136
- lambda x: ImageUtility.PKImageTools.roundOff(str(x).split("% (")[0] + colorText.END,0)
131
+ if "RUNNER" in os.environ.keys():
132
+ self.monitor_df.reset_index(inplace=True)
133
+ with pd.option_context('mode.chained_assignment', None):
134
+ self.monitor_df = self.monitor_df[["Stock", "LTP", "%Chng","52Wk-H","RSI/i" if "RSI/i" in self.monitor_df.columns else "RSI","Volume"]]
135
+ # Import Utility here since Utility has dependency on PKScheduler which in turn has dependency on
136
+ # multiprocessing, which behaves erratically if imported at the top.
137
+ self.monitor_df.loc[:, "%Chng"] = self.monitor_df.loc[:, "%Chng"].astype(str).apply(
138
+ lambda x: ImageUtility.PKImageTools.roundOff(str(x).split("% (")[0] + colorText.END,0)
139
+ )
140
+ self.monitor_df.loc[:, "52Wk-H"] = self.monitor_df.loc[:, "52Wk-H"].astype(str).apply(
141
+ lambda x: ImageUtility.PKImageTools.roundOff(x,0)
137
142
  )
138
- screen_monitor_df.loc[:, "52Wk-H"] = screen_monitor_df.loc[:, "52Wk-H"].astype(str).apply(
139
- lambda x: ImageUtility.PKImageTools.roundOff(x,0)
140
- )
141
- screen_monitor_df.loc[:, "Volume"] = screen_monitor_df.loc[:, "Volume"].astype(str).apply(
142
- lambda x: ImageUtility.PKImageTools.roundOff(x,0)
143
- )
144
- screen_monitor_df.rename(columns={"%Chng": "Ch%","Volume":"Vol","52Wk-H":"52WkH", "RSI":"RSI/i"}, inplace=True)
145
- telegram_df = self.updateDataFrameForTelegramMode(telegram, screen_monitor_df)
146
-
143
+ self.monitor_df.loc[:, "Volume"] = self.monitor_df.loc[:, "Volume"].astype(str).apply(
144
+ lambda x: ImageUtility.PKImageTools.roundOff(x,0)
145
+ )
146
+ self.monitor_df.rename(columns={"%Chng": "Ch%","Volume":"Vol","52Wk-H":"52WkH", "RSI":"RSI/i"}, inplace=True)
147
+ telegram_df = self.updateDataFrameForTelegramMode(telegram or "RUNNER" in os.environ.keys(), self.monitor_df)
148
+ self.monitor_df.set_index("Stock",inplace=True)
149
+
150
+ if not self.isPinnedSingleMonitorMode:
151
+ screen_monitor_df.reset_index(inplace=True)
152
+ with pd.option_context('mode.chained_assignment', None):
153
+ screen_monitor_df = screen_monitor_df[["Stock", "LTP", "%Chng","52Wk-H","RSI/i" if "RSI/i" in screen_monitor_df.columns else "RSI","Volume"]].head(self.maxNumRowsInEachResult-1)
154
+ # Import Utility here since Utility has dependency on PKScheduler which in turn has dependency on
155
+ # multiprocessing, which behaves erratically if imported at the top.
156
+ screen_monitor_df.loc[:, "%Chng"] = screen_monitor_df.loc[:, "%Chng"].astype(str).apply(
157
+ lambda x: ImageUtility.PKImageTools.roundOff(str(x).split("% (")[0] + colorText.END,0)
158
+ )
159
+ screen_monitor_df.loc[:, "52Wk-H"] = screen_monitor_df.loc[:, "52Wk-H"].astype(str).apply(
160
+ lambda x: ImageUtility.PKImageTools.roundOff(x,0)
161
+ )
162
+ screen_monitor_df.loc[:, "Volume"] = screen_monitor_df.loc[:, "Volume"].astype(str).apply(
163
+ lambda x: ImageUtility.PKImageTools.roundOff(x,0)
164
+ )
165
+ screen_monitor_df.rename(columns={"%Chng": "Ch%","Volume":"Vol","52Wk-H":"52WkH", "RSI":"RSI/i"}, inplace=True)
166
+ telegram_df = self.updateDataFrameForTelegramMode(telegram or "RUNNER" in os.environ.keys(), screen_monitor_df)
147
167
 
148
168
  if monitorPosition is not None:
149
169
  startRowIndex, startColIndex = monitorPosition
@@ -197,7 +217,8 @@ class MarketMonitor(SingletonMixin, metaclass=SingletonType):
197
217
  stockName = (f"{colorText.BOLD}{colorText.WHITE_FG_BRED_BG}{stock}{colorText.END}") if stockName in self.alertStocks else stock
198
218
  updatedStocks.append(stockName)
199
219
  self.monitor_df.reset_index(inplace=True)
200
- self.monitor_df["Stock"] = updatedStocks
220
+ with pd.option_context('mode.chained_assignment', None):
221
+ self.monitor_df["Stock"] = updatedStocks
201
222
  self.monitor_df.set_index("Stock",inplace=True)
202
223
 
203
224
  self.monitor_df = self.monitor_df.replace(np.nan, "-", regex=True)
@@ -241,13 +262,20 @@ class MarketMonitor(SingletonMixin, metaclass=SingletonType):
241
262
  if telegram:
242
263
  self.updateIfRunningInTelegramBotMode(screenOptions, chosenMenu, dbTimestamp, telegram, telegram_df)
243
264
  else:
244
- if ((screenOptions in self.alertOptions and numRecords > 1) or len(self.alertStocks) > 0): # Alert conditions met? Sound alert!
245
- notify_df = telegram_df[telegram_df["Stock"].isin(self.alertStocks)]
246
- notify_output = self.updateIfRunningInTelegramBotMode(screenOptions, chosenMenu, dbTimestamp, False, notify_df)
247
- if len(notify_output) > 0:
248
- from PKDevTools.classes.pubsub.publisher import PKUserService
249
- PKUserService().notify_user(scannerID=screenOptions.replace(":D","").replace(":","_"),notification=notify_output)
250
- # notify_df = self.monitor_df.reindex(self.alertStocks) # Includes missing stocks, if any. Returns NaN for such cases
265
+ if ((screenOptions in self.alertOptions and numRecords > 3) or len(self.alertStocks) > 0 or not self.firstAlertTriggered): # Alert conditions met? Sound alert!
266
+ # numRecords is actually new lines. Top 3 lines are only headers
267
+ if telegram_df is not None:
268
+ telegram_df.reset_index(inplace=True)
269
+ notify_df = telegram_df[telegram_df["Stock"].isin(self.alertStocks)] if self.firstAlertTriggered else telegram_df
270
+ notify_df = notify_df[["Stock","LTP","Ch%","Vol"]].head(50)
271
+ if len(notify_df) > 0:
272
+ notify_output = self.updateIfRunningInTelegramBotMode(screenOptions, chosenMenu, dbTimestamp, False, notify_df,maxcolwidths=None)
273
+ if len(notify_output) > 0:
274
+ from PKDevTools.classes.pubsub.publisher import PKUserService
275
+ from PKDevTools.classes.pubsub.subscriber import notification_service
276
+ PKUserService().notify_user(scannerID=self.getScanOptionName(screenOptions),notification=notify_output)
277
+ self.firstAlertTriggered = True
278
+ # notify_df = self.monitor_df.reindex(self.alertStocks) # Includes missing stocks, if any. Returns NaN for such cases
251
279
  Utility.tools.alertSound(beeps=5)
252
280
  sleep(self.pinnedIntervalWaitSeconds)
253
281
 
@@ -280,23 +308,27 @@ class MarketMonitor(SingletonMixin, metaclass=SingletonType):
280
308
  pass
281
309
  return telegram_df
282
310
 
283
- def updateIfRunningInTelegramBotMode(self, screenOptions, chosenMenu, dbTimestamp, telegram, telegram_df):
311
+ def updateIfRunningInTelegramBotMode(self, screenOptions, chosenMenu, dbTimestamp, telegram, telegram_df,maxcolwidths=[None,None,4,3]):
284
312
  result_output = ""
313
+ telegram_df_tabulated = ""
285
314
  if telegram_df is not None:
286
315
  STD_ENCODING=sys.stdout.encoding if sys.stdout is not None else 'utf-8'
287
-
288
- telegram_df_tabulated = colorText.miniTabulator().tabulate(
289
- telegram_df,
290
- headers="keys",
291
- tablefmt=colorText.No_Pad_GridFormat,
292
- showindex=False,
293
- maxcolwidths=[None,None,4,3]
294
- ).encode("utf-8").decode(STD_ENCODING).replace("-K-----S-----C-----R","-K-----S----C---R").replace("% ","% ").replace("=K=====S=====C=====R","=K=====S====C===R").replace("Vol |","Vol|").replace("x ","x")
316
+ try:
317
+ telegram_df_tabulated = colorText.miniTabulator().tabulate(
318
+ telegram_df,
319
+ headers="keys",
320
+ tablefmt=colorText.No_Pad_GridFormat,
321
+ showindex=False,
322
+ maxcolwidths=maxcolwidths if maxcolwidths is not None else None
323
+ ).encode("utf-8").decode(STD_ENCODING).replace("-K-----S-----C-----R","-K-----S----C---R").replace("% ","% ").replace("=K=====S=====C=====R","=K=====S====C===R").replace("Vol |","Vol|").replace("x ","x")
324
+ except Exception as e:
325
+ default_logger().debug(e,exc_info=True)
326
+ pass
295
327
  telegram_df_tabulated = telegram_df_tabulated.replace("-E-----N-----E-----R","-E-----N----E---R").replace("=E=====N=====E=====R","=E=====N====E===R")
296
328
  choiceSegments = chosenMenu.split(">")
297
329
  optionName = self.getScanOptionName(screenOptions)
298
330
  chosenMenu = f"{choiceSegments[-2]}>{choiceSegments[-1]}" if (len(choiceSegments)>=4 or len(choiceSegments[-1]) <= 10) else f"{choiceSegments[-1]}"
299
- result_output = f"Latest data as of:{dbTimestamp}\n<b>{optionName}{chosenMenu}</b> [{screenOptions}]\n<pre>{telegram_df_tabulated}</pre>"
331
+ result_output = f"Latest data as of {dbTimestamp}\n<b>[{optionName}] {chosenMenu}</b> [{screenOptions}]\n<pre>{telegram_df_tabulated}</pre>"
300
332
  try:
301
333
  if telegram:
302
334
  filePath = os.path.join(Archiver.get_user_data_dir(), f"monitor_outputs_{self.monitorIndex}.txt")
@@ -311,6 +343,10 @@ class MarketMonitor(SingletonMixin, metaclass=SingletonType):
311
343
  from pkscreener.classes.MenuOptions import PREDEFINED_SCAN_MENU_VALUES
312
344
  if screenOptions is None:
313
345
  return ""
346
+ baseIndex = 12
347
+ baseIndices = screenOptions.split(":")
348
+ if len(baseIndices) > 1:
349
+ baseIndex = baseIndices[1]
314
350
  choices = f"--systemlaunched -a y -e -o '{screenOptions.replace('C:','X:').replace('D:','')}'"
315
351
  indexNum = -1
316
352
  try:
@@ -319,5 +355,5 @@ class MarketMonitor(SingletonMixin, metaclass=SingletonType):
319
355
  pass
320
356
  optionName = ""
321
357
  if indexNum >= 0:
322
- optionName = f"{('P_1_'+str(indexNum +1)+':') if '>|' in choices else optionName}"
358
+ optionName = f"{('P_1_'+str(indexNum +1)+'_'+str(baseIndex)) if '>|' in choices else screenOptions.replace(':D','').replace(':','_')}"
323
359
  return optionName
@@ -0,0 +1 @@
1
+ VERSION='0.46.20250213.705'
@@ -1145,6 +1145,9 @@ def main(userArgs=None,optionalFinalOutcome_df=None):
1145
1145
  stockListParam = f" --stocklist {userPassedArgs.stocklist}" if userPassedArgs.stocklist else ""
1146
1146
  slicewindowParam = f" --slicewindow {userPassedArgs.slicewindow}" if userPassedArgs.slicewindow else ""
1147
1147
  fnameParam = f" --fname {resultsContentsEncoded}" if resultsContentsEncoded else ""
1148
+ if userPassedArgs.monitor and "-e -o" in scannerOptionQuoted:
1149
+ # We've been launched in monitor mode. Get rid of -e -o
1150
+ scannerOptionQuoted = scannerOptionQuoted.replace("-e -o","-m")
1148
1151
  OutputControls().printOutput(f"{colorText.GREEN}Launching PKScreener with piped scanners. If it does not launch, please try with the following:{colorText.END}\n{colorText.FAIL}{launcher} {scannerOptionQuoted}{requestingUser}{enableLog}{backtestParam}{enableTelegramMode}{stockListParam}{slicewindowParam}{fnameParam}{colorText.END}")
1149
1152
  sleep(2)
1150
1153
  os.system(f"{launcher} {scannerOptionQuoted}{requestingUser}{enableLog}{backtestParam}{enableTelegramMode}{stockListParam}{slicewindowParam}{fnameParam}")
@@ -19,7 +19,7 @@ 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.229
22
+ PKDevTools>=0.13.20250126.230
23
23
  PKNSETools>=0.1.20250122.136
24
24
  Pyarrow #>=17.0.0
25
25
  pyppeteer #>=2.0.0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pkscreener
3
- Version: 0.46.20250212.704
3
+ Version: 0.46.20250213.705
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.20250212.704.zip
6
+ Download-URL: https://github.com/pkjmesra/pkscreener/archive/v0.46.20250213.705.zip
7
7
  Author: pkjmesra
8
8
  Author-email: pkjmesra@gmail.com
9
9
  License: OSI Approved (MIT)
@@ -33,7 +33,7 @@ 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.229
36
+ Requires-Dist: PKDevTools>=0.13.20250126.230
37
37
  Requires-Dist: PKNSETools>=0.1.20250122.136
38
38
  Requires-Dist: Pyarrow
39
39
  Requires-Dist: pyppeteer
@@ -392,15 +392,15 @@ After you have finished the run, go to that copied path, zip the contents of the
392
392
  [MADE-IN-INDIA-badge]: https://img.shields.io/badge/MADE%20WITH%20%E2%9D%A4%20IN-INDIA-orange
393
393
  [MADE-IN-INDIA]: https://en.wikipedia.org/wiki/India
394
394
  [Windows-badge]: https://img.shields.io/badge/Windows-0078D6?logo=windows&logoColor=white
395
- [Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250210.703/pkscreenercli.exe
395
+ [Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250212.704/pkscreenercli.exe
396
396
  [Linux-badge_x64]: https://img.shields.io/badge/Linux(x64)-FCC624?logo=linux&logoColor=black
397
- [Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250210.703/pkscreenercli_x64.bin
397
+ [Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250212.704/pkscreenercli_x64.bin
398
398
  [Linux-badge_arm64]: https://img.shields.io/badge/Linux(arm64)-FCC624?logo=linux&logoColor=black
399
- [Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250210.703/pkscreenercli_arm64.bin
399
+ [Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250212.704/pkscreenercli_arm64.bin
400
400
  [Mac OS-badge_x64]: https://img.shields.io/badge/mac%20os(x64)-D3D3D3?logo=apple&logoColor=000000
401
- [Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250210.703/pkscreenercli_x64.run
401
+ [Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250212.704/pkscreenercli_x64.run
402
402
  [Mac OS-badge_arm64]: https://img.shields.io/badge/mac%20os(arm64)-D3D3D3?logo=apple&logoColor=000000
403
- [Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250210.703/pkscreenercli_arm64.run
403
+ [Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250212.704/pkscreenercli_arm64.run
404
404
  [GitHub release (latest by date)-badge]: https://img.shields.io/github/v/release/pkjmesra/PKScreener
405
405
  [GitHub release (latest by date)]: https://github.com/pkjmesra/PKScreener/releases/latest
406
406
  [pypi-badge]: https://img.shields.io/pypi/v/pkscreener.svg?style=flat-square
@@ -0,0 +1,58 @@
1
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/Disclaimer.txt,sha256=kBZQSQCFfL2kc1bijXWndZzkjMTtnpH_B7XtDPPMcuw,1396
2
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/LICENSE-Others.txt,sha256=WBslRYLBoqYg-vr25sS1c_UI7cuUnsGk0nIQLBzTWEE,271830
3
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/LICENSE.txt,sha256=CdnyGrl-xRYX67ZkdERZWHr6BlTxOyg8Z8sK1XQ5Xsg,1078
4
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/LogoWM.txt,sha256=7Njnavpy_FKY4Iwbzv1JqsYMcOdkDSKAKXP3SAItKV0,14868
5
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/README.txt,sha256=A-nV1tUTIb20yAalwQmJ2HgC8KZXknH2WjxboVx1gNE,32701
6
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/__init__.py,sha256=aZ62qYACxsU8m8_5JkzNzos1lVFNcMGPRMgeddnUUiQ,1633
7
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/courbd.ttf,sha256=SKpnp-BRs7AZcdI83nencS3Q7xe0anbbP1YMOxLlEhU,791436
8
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/globals.py,sha256=bIj3LBnbiGvVYidOF0sohg19jHTEkAavrGYaYFyBPhM,240829
9
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/pkscreener.ini,sha256=QKs6j4qhyH37L_MdG3ztAIwgqs4c3qihuqDIoex-V2g,2391
10
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/pkscreenerbot.py,sha256=5vzU5gDJUZ55tBdFOW-Yw6Nn424cjUIhdHFHOnix9tQ,106017
11
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/pkscreenercli.py,sha256=WEVXfcZdeogWZBY3CWtRYyFrmQa5BEEZedKLlMwCM5U,56999
12
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/requirements.txt,sha256=I_XyrBce9fsPWc0k0gDzSNmoA7e2xKCuRP53AEUUDHo,1457
13
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/ArtTexts.py,sha256=LZ8ynyS8woliv8bM9Nq4aU0VCoJDJU0FgZk8V5zYPmg,19504
14
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/AssetsManager.py,sha256=SutbAZ4JiGhzN0tzfa9vNpHdW6alSL67Jz-knPPcqBw,33706
15
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/Backtest.py,sha256=wobBQgqVQhFNZlyJ2hgMXQqofrICc_3F0I5D66DUvGI,10530
16
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/Barometer.py,sha256=WPrgtIXb1nIbb-FnuRs-yvOQ5baNQRBgUR_zWg1moxk,9464
17
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/BaseScreeningStatistics.py,sha256=u5t1wf-HsZ8xEtprON55ehIR3F2LNNq8LvwgIrhYRmU,3000
18
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/CandlePatterns.py,sha256=gaswU2OeDa3JXjEafR2clUpKW5v8_1_tJuNPuTWsAss,17066
19
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/Changelog.py,sha256=vUOpca28OACNhavAmjBm4xco3u6fcHqWlnlmCJqO5Lk,1469
20
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/ConfigManager.py,sha256=THcfBgua5hr1Pv7AwEDBu2yurCNteGM04jY3Fr_MeBg,53565
21
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/ConsoleMenuUtility.py,sha256=fyR7dEsAaEWEe5SyaVgwLPdU4h4pI8SozUhsPZXShpg,10037
22
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/ConsoleUtility.py,sha256=TrEnTT4pmsBpEYdwD2oAtNqNG_drPe1LVkhthP2540I,12096
23
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/Fetcher.py,sha256=WWX9_NO3JTw6_1Z9SqPm4Nj-4Uy_4PPYEMVyD5FLnVo,12336
24
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/GlobalStore.py,sha256=IzoYMybXpVVf6YwZi7j34rP-hNd7sMened8TAMu_-A8,3709
25
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/ImageUtility.py,sha256=mgJUzjrOKQ1mYV5P_ylhBnaF7ZgOO6ogjy22Rt49TNI,37032
26
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/MarketMonitor.py,sha256=tRpyb-5QlZt_IYfeckOSAbdtn8YCNue58VAFasdp-5w,21384
27
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/MarketStatus.py,sha256=dNg8znbRpt7ID3U_1nmclD4zSLtveJeYeRbS0l6HLtE,3737
28
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/MenuOptions.py,sha256=iZb0zBs7lcP60cmuP7Z5xmXfNtTFcFH6ZWOuoileErE,64552
29
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/Messenger.py,sha256=peyY-YiqdC1bp-3DlJXILRa9HGYbqGVzf1wil0fYv98,8396
30
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/OtaUpdater.py,sha256=_7-nFAC-vAcmZ1Nwi5g5tfp7hKQQPuLUnBCOzrwC39g,13491
31
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/PKAnalytics.py,sha256=_X-2OFw2yQVmXlEIRsnBVNy9fhYyxqt0BOqADD4v08U,5246
32
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/PKDataService.py,sha256=BipM8Z4rS6h12cF6VWv_u4Z8ee7psMFd1yUojejW1Ag,3393
33
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/PKDemoHandler.py,sha256=r4KrZF8TaOu1J0nu8sUsgWEvnbndboWQQvz69GOy1Fk,2207
34
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/PKMarketOpenCloseAnalyser.py,sha256=T7S0DRv4Tqg77S5CyTWQUgpIAtx0NEtSVAplkynS2YM,33833
35
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/PKPremiumHandler.py,sha256=r16-u9fyc0ftgnSnZnz-JusTfEzyQIyKkvgbPuSd7W4,5611
36
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/PKScanRunner.py,sha256=EPLo2euBMfA9omnqrr5pXv2h9KzTcPZM-PXRFI26LSo,26791
37
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/PKScheduledTaskProgress.py,sha256=h19ZuxoalB50pnZjntFh12b9mBozvMqhKYq6TL18vo4,1657
38
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/PKScheduler.py,sha256=qThoz0yXLmHEWAiD_TdkIrzJb37b_m830JJFrkN1Tio,8814
39
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/PKSpreadsheets.py,sha256=1I7YGGPPY879K5JeTZ_d1FNCpjloh6TZrx91JlwT20o,8298
40
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/PKTask.py,sha256=4q87uD2cXvp0AbP6I73xPP39F0mfnpHQutsxxqpnxJM,1867
41
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/PKUserRegistration.py,sha256=GPUau3sIhRGuQcV7mdLAACMb8KuJTUiMf5JcBbTfDbU,11202
42
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/Pktalib.py,sha256=7DNx9UL-l1ehXItzqyaUwtsVSuLB9ruhdsQZGZWqqv4,28959
43
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/Portfolio.py,sha256=JZ93n3Zk9nkSFaX-lHyQiFnavHVmHPFoy-L_4gugj54,13895
44
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/PortfolioXRay.py,sha256=4MjXqBAVUlfN4w5tTmgEnQGMoy0hFu_uaVgrmai1fN4,48339
45
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/ScreeningStatistics.py,sha256=p2rjc1MvZ-CmI_Uw_7jxy3NOMwo3cDB6WenxarsQTBM,221039
46
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/StockScreener.py,sha256=F0SWa1DSTgYdSWnkPTR9kmOKgHLtaqNMCtJP8yZkDnE,67252
47
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/StockSentiment.py,sha256=WL7TBAHDSIN5cgZ9uTbbEFnUPo4G-YIzEv16RpPGaro,3546
48
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/UserMenuChoicesHandler.py,sha256=_fTCscTLEjoU-n12V9237uDN6Jf8nGCvGdBVkpD3Ap4,4947
49
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/Utility.py,sha256=Cn_QrVH40rQWkHW2e2NolE0b18qszvGXfVLdwAqD7sM,13562
50
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/WorkflowManager.py,sha256=LT5tadtQm2Cd4ZDYfF5KSzcOfQHmbI2lrkA-8l3P3tA,4739
51
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/__init__.py,sha256=35BuMZZk90woPoxvNaj-o1nH7fiybXCgCXjUP1wo0NI,28
52
+ pkscreener-0.46.20250213.705.data/purelib/pkscreener/classes/keys.py,sha256=LQq_t1lSh0x4TbRCIDhoCil3xctgLLeVk5f2vgrl1tk,6789
53
+ pkscreener-0.46.20250213.705.dist-info/LICENSE,sha256=CdnyGrl-xRYX67ZkdERZWHr6BlTxOyg8Z8sK1XQ5Xsg,1078
54
+ pkscreener-0.46.20250213.705.dist-info/METADATA,sha256=Qeb9uW7KSLdmmysfGF4hFALfWKmEmfwXklc86N3B42U,34639
55
+ pkscreener-0.46.20250213.705.dist-info/WHEEL,sha256=aDUArjEbIuDQzblE24IvdIsBzRhJEjiXmuNUYQ-gpaA,104
56
+ pkscreener-0.46.20250213.705.dist-info/entry_points.txt,sha256=Pm30xm4sU7YFtFJUC-Te8VlqOvYAvWKFFA5AfQE0xGY,120
57
+ pkscreener-0.46.20250213.705.dist-info/top_level.txt,sha256=oIfcPPw58Q4KU-GDqp25dXbrtvxYXJBCo_em6i5aVvY,11
58
+ pkscreener-0.46.20250213.705.dist-info/RECORD,,
@@ -1 +0,0 @@
1
- VERSION='0.46.20250212.704'
@@ -1,58 +0,0 @@
1
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/Disclaimer.txt,sha256=kBZQSQCFfL2kc1bijXWndZzkjMTtnpH_B7XtDPPMcuw,1396
2
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/LICENSE-Others.txt,sha256=WBslRYLBoqYg-vr25sS1c_UI7cuUnsGk0nIQLBzTWEE,271830
3
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/LICENSE.txt,sha256=CdnyGrl-xRYX67ZkdERZWHr6BlTxOyg8Z8sK1XQ5Xsg,1078
4
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/LogoWM.txt,sha256=7Njnavpy_FKY4Iwbzv1JqsYMcOdkDSKAKXP3SAItKV0,14868
5
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/README.txt,sha256=zHD1NcixJda3D3flRSOVVgb9_Q1uSKMeHivsppQ_Mto,32701
6
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/__init__.py,sha256=aZ62qYACxsU8m8_5JkzNzos1lVFNcMGPRMgeddnUUiQ,1633
7
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/courbd.ttf,sha256=SKpnp-BRs7AZcdI83nencS3Q7xe0anbbP1YMOxLlEhU,791436
8
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/globals.py,sha256=SpRnbMgWMSKxSBYMUWeJ-f2t-ayVbU-iqchfL2gJeZM,240591
9
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/pkscreener.ini,sha256=QKs6j4qhyH37L_MdG3ztAIwgqs4c3qihuqDIoex-V2g,2391
10
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/pkscreenerbot.py,sha256=5vzU5gDJUZ55tBdFOW-Yw6Nn424cjUIhdHFHOnix9tQ,106017
11
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/pkscreenercli.py,sha256=WEVXfcZdeogWZBY3CWtRYyFrmQa5BEEZedKLlMwCM5U,56999
12
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/requirements.txt,sha256=jLV8HcOTomFppQy62EOZojRII5hdu1yXK_zJ2FcV7bY,1457
13
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/ArtTexts.py,sha256=LZ8ynyS8woliv8bM9Nq4aU0VCoJDJU0FgZk8V5zYPmg,19504
14
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/AssetsManager.py,sha256=SutbAZ4JiGhzN0tzfa9vNpHdW6alSL67Jz-knPPcqBw,33706
15
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/Backtest.py,sha256=wobBQgqVQhFNZlyJ2hgMXQqofrICc_3F0I5D66DUvGI,10530
16
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/Barometer.py,sha256=WPrgtIXb1nIbb-FnuRs-yvOQ5baNQRBgUR_zWg1moxk,9464
17
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/BaseScreeningStatistics.py,sha256=u5t1wf-HsZ8xEtprON55ehIR3F2LNNq8LvwgIrhYRmU,3000
18
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/CandlePatterns.py,sha256=gaswU2OeDa3JXjEafR2clUpKW5v8_1_tJuNPuTWsAss,17066
19
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/Changelog.py,sha256=vUOpca28OACNhavAmjBm4xco3u6fcHqWlnlmCJqO5Lk,1469
20
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/ConfigManager.py,sha256=THcfBgua5hr1Pv7AwEDBu2yurCNteGM04jY3Fr_MeBg,53565
21
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/ConsoleMenuUtility.py,sha256=fyR7dEsAaEWEe5SyaVgwLPdU4h4pI8SozUhsPZXShpg,10037
22
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/ConsoleUtility.py,sha256=TrEnTT4pmsBpEYdwD2oAtNqNG_drPe1LVkhthP2540I,12096
23
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/Fetcher.py,sha256=WWX9_NO3JTw6_1Z9SqPm4Nj-4Uy_4PPYEMVyD5FLnVo,12336
24
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/GlobalStore.py,sha256=IzoYMybXpVVf6YwZi7j34rP-hNd7sMened8TAMu_-A8,3709
25
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/ImageUtility.py,sha256=mgJUzjrOKQ1mYV5P_ylhBnaF7ZgOO6ogjy22Rt49TNI,37032
26
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/MarketMonitor.py,sha256=ph07oYUazsiPLi1R7UW5gu839Fk-_h4vqAFehiZnmIs,18513
27
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/MarketStatus.py,sha256=dNg8znbRpt7ID3U_1nmclD4zSLtveJeYeRbS0l6HLtE,3737
28
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/MenuOptions.py,sha256=iZb0zBs7lcP60cmuP7Z5xmXfNtTFcFH6ZWOuoileErE,64552
29
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/Messenger.py,sha256=peyY-YiqdC1bp-3DlJXILRa9HGYbqGVzf1wil0fYv98,8396
30
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/OtaUpdater.py,sha256=_7-nFAC-vAcmZ1Nwi5g5tfp7hKQQPuLUnBCOzrwC39g,13491
31
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/PKAnalytics.py,sha256=_X-2OFw2yQVmXlEIRsnBVNy9fhYyxqt0BOqADD4v08U,5246
32
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/PKDataService.py,sha256=BipM8Z4rS6h12cF6VWv_u4Z8ee7psMFd1yUojejW1Ag,3393
33
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/PKDemoHandler.py,sha256=r4KrZF8TaOu1J0nu8sUsgWEvnbndboWQQvz69GOy1Fk,2207
34
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/PKMarketOpenCloseAnalyser.py,sha256=T7S0DRv4Tqg77S5CyTWQUgpIAtx0NEtSVAplkynS2YM,33833
35
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/PKPremiumHandler.py,sha256=r16-u9fyc0ftgnSnZnz-JusTfEzyQIyKkvgbPuSd7W4,5611
36
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/PKScanRunner.py,sha256=EPLo2euBMfA9omnqrr5pXv2h9KzTcPZM-PXRFI26LSo,26791
37
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/PKScheduledTaskProgress.py,sha256=h19ZuxoalB50pnZjntFh12b9mBozvMqhKYq6TL18vo4,1657
38
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/PKScheduler.py,sha256=qThoz0yXLmHEWAiD_TdkIrzJb37b_m830JJFrkN1Tio,8814
39
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/PKSpreadsheets.py,sha256=1I7YGGPPY879K5JeTZ_d1FNCpjloh6TZrx91JlwT20o,8298
40
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/PKTask.py,sha256=4q87uD2cXvp0AbP6I73xPP39F0mfnpHQutsxxqpnxJM,1867
41
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/PKUserRegistration.py,sha256=GPUau3sIhRGuQcV7mdLAACMb8KuJTUiMf5JcBbTfDbU,11202
42
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/Pktalib.py,sha256=7DNx9UL-l1ehXItzqyaUwtsVSuLB9ruhdsQZGZWqqv4,28959
43
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/Portfolio.py,sha256=JZ93n3Zk9nkSFaX-lHyQiFnavHVmHPFoy-L_4gugj54,13895
44
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/PortfolioXRay.py,sha256=4MjXqBAVUlfN4w5tTmgEnQGMoy0hFu_uaVgrmai1fN4,48339
45
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/ScreeningStatistics.py,sha256=p2rjc1MvZ-CmI_Uw_7jxy3NOMwo3cDB6WenxarsQTBM,221039
46
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/StockScreener.py,sha256=F0SWa1DSTgYdSWnkPTR9kmOKgHLtaqNMCtJP8yZkDnE,67252
47
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/StockSentiment.py,sha256=WL7TBAHDSIN5cgZ9uTbbEFnUPo4G-YIzEv16RpPGaro,3546
48
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/UserMenuChoicesHandler.py,sha256=_fTCscTLEjoU-n12V9237uDN6Jf8nGCvGdBVkpD3Ap4,4947
49
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/Utility.py,sha256=Cn_QrVH40rQWkHW2e2NolE0b18qszvGXfVLdwAqD7sM,13562
50
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/WorkflowManager.py,sha256=LT5tadtQm2Cd4ZDYfF5KSzcOfQHmbI2lrkA-8l3P3tA,4739
51
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/__init__.py,sha256=CskcYWn6TIIvnqhzijT_ZQbNJEx5QKZgGi-p2DmhHuw,28
52
- pkscreener-0.46.20250212.704.data/purelib/pkscreener/classes/keys.py,sha256=LQq_t1lSh0x4TbRCIDhoCil3xctgLLeVk5f2vgrl1tk,6789
53
- pkscreener-0.46.20250212.704.dist-info/LICENSE,sha256=CdnyGrl-xRYX67ZkdERZWHr6BlTxOyg8Z8sK1XQ5Xsg,1078
54
- pkscreener-0.46.20250212.704.dist-info/METADATA,sha256=EvyuI6nBBY5npQGViSgdhK87Q46MUmXIRiePpe3Wpy8,34639
55
- pkscreener-0.46.20250212.704.dist-info/WHEEL,sha256=aDUArjEbIuDQzblE24IvdIsBzRhJEjiXmuNUYQ-gpaA,104
56
- pkscreener-0.46.20250212.704.dist-info/entry_points.txt,sha256=Pm30xm4sU7YFtFJUC-Te8VlqOvYAvWKFFA5AfQE0xGY,120
57
- pkscreener-0.46.20250212.704.dist-info/top_level.txt,sha256=oIfcPPw58Q4KU-GDqp25dXbrtvxYXJBCo_em6i5aVvY,11
58
- pkscreener-0.46.20250212.704.dist-info/RECORD,,