pkscreener 0.46.20250222.732__cp310-cp310-macosx_13_0_arm64.whl → 0.46.20250222.734__cp310-cp310-macosx_13_0_arm64.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.
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/README.txt +5 -5
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/AssetsManager.py +1 -1
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/Fetcher.py +29 -20
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/PKAnalytics.py +12 -2
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/PKScanRunner.py +1 -1
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/StockScreener.py +17 -13
- pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/__init__.py +1 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/globals.py +10 -4
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/pkscreenercli.py +3 -1
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/requirements.txt +1 -1
- {pkscreener-0.46.20250222.732.dist-info → pkscreener-0.46.20250222.734.dist-info}/METADATA +8 -8
- pkscreener-0.46.20250222.734.dist-info/RECORD +58 -0
- pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/__init__.py +0 -1
- pkscreener-0.46.20250222.732.dist-info/RECORD +0 -58
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/Disclaimer.txt +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/LICENSE-Others.txt +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/LICENSE.txt +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/LogoWM.txt +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/__init__.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/ArtTexts.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/Backtest.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/Barometer.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/BaseScreeningStatistics.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/CandlePatterns.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/Changelog.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/ConfigManager.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/ConsoleMenuUtility.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/ConsoleUtility.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/GlobalStore.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/ImageUtility.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/MarketMonitor.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/MarketStatus.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/MenuOptions.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/Messenger.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/OtaUpdater.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/PKDataService.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/PKDemoHandler.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/PKMarketOpenCloseAnalyser.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/PKPremiumHandler.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/PKScheduledTaskProgress.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/PKScheduler.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/PKSpreadsheets.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/PKTask.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/PKUserRegistration.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/Pktalib.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/Portfolio.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/PortfolioXRay.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/ScreeningStatistics.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/StockSentiment.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/UserMenuChoicesHandler.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/Utility.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/WorkflowManager.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/classes/keys.py +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/courbd.ttf +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/pkscreener.ini +0 -0
- {pkscreener-0.46.20250222.732.data → pkscreener-0.46.20250222.734.data}/purelib/pkscreener/pkscreenerbot.py +0 -0
- {pkscreener-0.46.20250222.732.dist-info → pkscreener-0.46.20250222.734.dist-info}/LICENSE +0 -0
- {pkscreener-0.46.20250222.732.dist-info → pkscreener-0.46.20250222.734.dist-info}/WHEEL +0 -0
- {pkscreener-0.46.20250222.732.dist-info → pkscreener-0.46.20250222.734.dist-info}/entry_points.txt +0 -0
- {pkscreener-0.46.20250222.732.dist-info → pkscreener-0.46.20250222.734.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.
|
331
|
+
[Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250222.733/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.
|
333
|
+
[Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250222.733/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.
|
335
|
+
[Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250222.733/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.
|
337
|
+
[Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250222.733/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.
|
339
|
+
[Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250222.733/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
|
@@ -268,7 +268,7 @@ class PKAssetsManager:
|
|
268
268
|
def had_rate_limit_errors():
|
269
269
|
"""Checks if any stored errors are YFRateLimitError."""
|
270
270
|
err = ",".join(list(shared._ERRORS.values()))
|
271
|
-
hitRateLimit = "YFRateLimitError" in err
|
271
|
+
hitRateLimit = "YFRateLimitError" in err or "Too Many Requests" in err
|
272
272
|
if hitRateLimit:
|
273
273
|
OutputControls().printOutput(
|
274
274
|
colorText.FAIL
|
@@ -35,13 +35,19 @@ import yfinance as yf
|
|
35
35
|
from yfinance import shared
|
36
36
|
# from yfinance.const import USER_AGENTS
|
37
37
|
from PKDevTools.classes.Utils import USER_AGENTS
|
38
|
-
from yfinance.data import YfData
|
39
38
|
import random
|
40
|
-
from yfinance.
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
39
|
+
from yfinance.version import version as yfVersion
|
40
|
+
if yfVersion == "0.2.28":
|
41
|
+
from yfinance.data import TickerData as YfData
|
42
|
+
class YFPricesMissingError(Exception):
|
43
|
+
pass
|
44
|
+
class YFInvalidPeriodError(Exception):
|
45
|
+
pass
|
46
|
+
class YFRateLimitError(Exception):
|
47
|
+
pass
|
48
|
+
else:
|
49
|
+
from yfinance.data import YfData
|
50
|
+
from yfinance.exceptions import YFPricesMissingError, YFInvalidPeriodError, YFRateLimitError
|
45
51
|
from concurrent.futures import ThreadPoolExecutor
|
46
52
|
from PKDevTools.classes.PKDateUtilities import PKDateUtilities
|
47
53
|
from PKDevTools.classes.ColorText import colorText
|
@@ -123,8 +129,9 @@ class screenerStockDataFetcher(nseStockDataFetcher):
|
|
123
129
|
data = None
|
124
130
|
with SuppressOutput(suppress_stdout=(not printCounter), suppress_stderr=(not printCounter)):
|
125
131
|
try:
|
126
|
-
|
127
|
-
|
132
|
+
if yfVersion == "0.2.28":
|
133
|
+
YfData.user_agent_headers = {
|
134
|
+
'User-Agent': random.choice(USER_AGENTS)}
|
128
135
|
data = yf.download(
|
129
136
|
tickers=stockCode,
|
130
137
|
period=period,
|
@@ -136,7 +143,8 @@ class screenerStockDataFetcher(nseStockDataFetcher):
|
|
136
143
|
timeout=self.configManager.generalTimeout/4,
|
137
144
|
start=start,
|
138
145
|
end=end,
|
139
|
-
auto_adjust=True
|
146
|
+
auto_adjust=True,
|
147
|
+
threads=len(stockCode) if not isinstance(stockCode,str) else True
|
140
148
|
)
|
141
149
|
if isinstance(stockCode,str):
|
142
150
|
if (data is None or data.empty):
|
@@ -165,25 +173,26 @@ class screenerStockDataFetcher(nseStockDataFetcher):
|
|
165
173
|
# we'd have received a multiindex dataframe
|
166
174
|
listStockCodes = multiIndex.get_level_values(0)
|
167
175
|
data = data.get(listStockCodes[0])
|
168
|
-
else:
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
176
|
+
# else:
|
177
|
+
# if (data is None or data.empty):
|
178
|
+
# if len(shared._ERRORS) > 0:
|
179
|
+
# default_logger().debug(shared._ERRORS)
|
180
|
+
# for ticker in shared._ERRORS:
|
181
|
+
# err = shared._ERRORS.get(ticker)
|
182
|
+
# if "YFRateLimitError" in err:
|
183
|
+
# if attempt <= 2:
|
184
|
+
# default_logger().debug(f"YFRateLimitError Hit! Going for attempt : {attempt+1}")
|
177
185
|
# sleep(attempt*2) # Exponential backoff
|
178
186
|
# return self.fetchStockData(stockCode=stockCode,period=period,duration=duration,printCounter=printCounter, start=start,end=end,screenResultsCounter=screenResultsCounter,screenCounter=screenCounter,totalSymbols=totalSymbols,exchangeSuffix=exchangeSuffix,attempt=attempt+1)
|
179
187
|
except (KeyError,YFPricesMissingError) as e: # pragma: no cover
|
180
188
|
default_logger().debug(e,exc_info=True)
|
181
189
|
pass
|
182
190
|
except YFRateLimitError as e:
|
183
|
-
if attempt <= 2:
|
184
|
-
|
191
|
+
# if attempt <= 2:
|
192
|
+
# default_logger().debug(f"YFRateLimitError Hit! Going for attempt : {attempt+1}")
|
185
193
|
# sleep(attempt*2) # Exponential backoff
|
186
194
|
# return self.fetchStockData(stockCode=stockCode,period=period,duration=duration,printCounter=printCounter, start=start,end=end,screenResultsCounter=screenResultsCounter,screenCounter=screenCounter,totalSymbols=totalSymbols,exchangeSuffix=exchangeSuffix,attempt=attempt+1)
|
195
|
+
pass
|
187
196
|
except (YFInvalidPeriodError,Exception) as e: # pragma: no cover
|
188
197
|
default_logger().debug(e,exc_info=True)
|
189
198
|
if printCounter and type(screenCounter) != int:
|
@@ -25,6 +25,7 @@
|
|
25
25
|
"""
|
26
26
|
|
27
27
|
import os
|
28
|
+
import sys
|
28
29
|
# import base64
|
29
30
|
from sys import platform
|
30
31
|
import platform
|
@@ -41,7 +42,7 @@ from PKDevTools.classes.Singleton import SingletonType, SingletonMixin
|
|
41
42
|
from PKDevTools.classes.pubsub.publisher import PKUserService
|
42
43
|
from PKDevTools.classes.pubsub.subscriber import notification_service
|
43
44
|
from pkscreener.classes import VERSION
|
44
|
-
|
45
|
+
from pkscreener.classes.ConfigManager import tools, parser
|
45
46
|
class PKAnalyticsService(SingletonMixin, metaclass=SingletonType):
|
46
47
|
def __init__(self):
|
47
48
|
super(PKAnalyticsService, self).__init__()
|
@@ -52,9 +53,14 @@ class PKAnalyticsService(SingletonMixin, metaclass=SingletonType):
|
|
52
53
|
self.app_version = VERSION
|
53
54
|
self.start_time = time.time()
|
54
55
|
self.isRunner = "RUNNER" in os.environ.keys()
|
56
|
+
self.onefile = getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS')
|
57
|
+
self.configManager = tools()
|
58
|
+
self.configManager.getConfig(parser)
|
55
59
|
|
56
60
|
def collectMetrics(self,user=None):
|
57
61
|
try:
|
62
|
+
if not self.configManager.enableUsageAnalytics:
|
63
|
+
return
|
58
64
|
self.userName = self.getUserName()
|
59
65
|
metrics = self.getApproxLocationInfo()
|
60
66
|
self.locationInfo = metrics
|
@@ -92,6 +98,8 @@ class PKAnalyticsService(SingletonMixin, metaclass=SingletonType):
|
|
92
98
|
return data
|
93
99
|
|
94
100
|
def send_event(self,event_name,params={}):
|
101
|
+
if not self.configManager.enableUsageAnalytics:
|
102
|
+
return
|
95
103
|
if isinstance(self.locationInfo,str):
|
96
104
|
self.collectMetrics()
|
97
105
|
event_params = {
|
@@ -100,7 +108,9 @@ class PKAnalyticsService(SingletonMixin, metaclass=SingletonType):
|
|
100
108
|
"os_version": self.os_version,
|
101
109
|
"app_version": self.app_version,
|
102
110
|
"elapsed_time": str(time.time() - self.start_time),
|
103
|
-
"
|
111
|
+
"is_runner": self.isRunner,
|
112
|
+
"is_container": str(os.environ.get("PKSCREENER_DOCKER", "")).lower() in ("yes", "y", "on", "true", "1"),
|
113
|
+
"one_file_bundle": self.onefile
|
104
114
|
}
|
105
115
|
if len(params) > 0:
|
106
116
|
for key in params:
|
@@ -412,7 +412,7 @@ class PKScanRunner:
|
|
412
412
|
cleanup_on_sigterm()
|
413
413
|
OutputControls().printOutput(
|
414
414
|
colorText.FAIL
|
415
|
-
+ f"[+] Using Period:{colorText.END}{colorText.GREEN}{PKScanRunner.configManager.period}{colorText.END}{colorText.FAIL} and Duration:{colorText.END}{colorText.GREEN}{PKScanRunner.configManager.duration}{colorText.END}{colorText.FAIL} for scan! You can change this in user config."
|
415
|
+
+ f"\n [+] Using Period:{colorText.END}{colorText.GREEN}{PKScanRunner.configManager.period}{colorText.END}{colorText.FAIL} and Duration:{colorText.END}{colorText.GREEN}{PKScanRunner.configManager.duration}{colorText.END}{colorText.FAIL} for scan! You can change this in user config."
|
416
416
|
+ colorText.END
|
417
417
|
)
|
418
418
|
start_time = time.time()
|
@@ -981,19 +981,23 @@ class StockScreener:
|
|
981
981
|
data.set_index("Date", inplace=True)
|
982
982
|
data.drop("index",axis=1,inplace=True)
|
983
983
|
else:
|
984
|
-
|
985
|
-
|
986
|
-
|
987
|
-
|
988
|
-
|
989
|
-
|
990
|
-
|
991
|
-
|
992
|
-
|
993
|
-
|
994
|
-
|
995
|
-
|
996
|
-
|
984
|
+
# The following code tries to re-fetch the missing stock data
|
985
|
+
# It has been commented because it's less likely to fetch the data again
|
986
|
+
# within seconds of the first try when we must have tried to fetch data
|
987
|
+
# in batches.
|
988
|
+
# data = fetcher.fetchStockData(
|
989
|
+
# stock,
|
990
|
+
# period,
|
991
|
+
# configManager.duration if duration is None else duration,
|
992
|
+
# hostRef.proxyServer,
|
993
|
+
# hostRef.processingResultsCounter,
|
994
|
+
# hostRef.processingCounter,
|
995
|
+
# totalSymbols,
|
996
|
+
# start=start,
|
997
|
+
# end=start,
|
998
|
+
# exchangeSuffix=".NS" if exchangeName == "INDIA" else "",
|
999
|
+
# printCounter=printCounter
|
1000
|
+
# )
|
997
1001
|
if hostData is not None and data is not None:
|
998
1002
|
# During the market trading hours, we don't want to go for MFI/FV value fetching
|
999
1003
|
# So let's copy the old saved ones.
|
@@ -0,0 +1 @@
|
|
1
|
+
VERSION='0.46.20250222.734'
|
@@ -625,6 +625,7 @@ def initPostLevel0Execution(
|
|
625
625
|
str(indexOption).upper() in ["S", "E", "W"]:
|
626
626
|
ensureMenusLoaded(menuOption,indexOption,executeOption)
|
627
627
|
if not PKPremiumHandler.hasPremium(m1.find(str(indexOption).upper())):
|
628
|
+
PKAnalyticsService().send_event(f"non_premium_user_{menuOption}_{indexOption}_{executeOption}")
|
628
629
|
return None, None
|
629
630
|
if indexOption == "" or indexOption is None:
|
630
631
|
indexOption = int(configManager.defaultIndex)
|
@@ -679,10 +680,11 @@ def initPostLevel1Execution(indexOption, executeOption=None, skip=[], retrial=Fa
|
|
679
680
|
)
|
680
681
|
selectedMenu = m1.find(indexOption)
|
681
682
|
m2.renderForMenu(selectedMenu=selectedMenu, skip=skip)
|
682
|
-
stockIndexCode =
|
683
|
+
stockIndexCode = str(len(level1_index_options_sectoral.keys()))
|
683
684
|
if indexOption == "S":
|
684
685
|
ensureMenusLoaded("X",indexOption,executeOption)
|
685
686
|
if not PKPremiumHandler.hasPremium(selectedMenu):
|
687
|
+
PKAnalyticsService().send_event(f"non_premium_user_X_{indexOption}_{executeOption}")
|
686
688
|
PKAnalyticsService().send_event("app_exit")
|
687
689
|
sys.exit(0)
|
688
690
|
indexKeys = level1_index_options_sectoral.keys()
|
@@ -711,6 +713,7 @@ def initPostLevel1Execution(indexOption, executeOption=None, skip=[], retrial=Fa
|
|
711
713
|
OutputControls().printOutput(colorText.END, end="")
|
712
714
|
ensureMenusLoaded("X",indexOption,executeOption)
|
713
715
|
if not PKPremiumHandler.hasPremium(m2.find(str(executeOption))):
|
716
|
+
PKAnalyticsService().send_event(f"non_premium_user_X_{indexOption}_{executeOption}")
|
714
717
|
return None, None
|
715
718
|
if executeOption == "":
|
716
719
|
executeOption = 1
|
@@ -922,7 +925,6 @@ def main(userArgs=None,optionalFinalOutcome_df=None):
|
|
922
925
|
mkt_monitor_dict = mp_manager.dict()
|
923
926
|
# Let's start monitoring the market monitor
|
924
927
|
startMarketMonitor(mkt_monitor_dict,keyboardInterruptEvent)
|
925
|
-
PKAnalyticsService().send_event("market_monitor_started")
|
926
928
|
|
927
929
|
keyboardInterruptEventFired = False
|
928
930
|
if stockDictPrimary is None:
|
@@ -953,7 +955,7 @@ def main(userArgs=None,optionalFinalOutcome_df=None):
|
|
953
955
|
if menuOption in ["F", "M", "S", "B", "G", "C", "P", "D"] or selectedMenu.isPremium:
|
954
956
|
ensureMenusLoaded(menuOption,indexOption,executeOption)
|
955
957
|
if not PKPremiumHandler.hasPremium(selectedMenu):
|
956
|
-
PKAnalyticsService().send_event(f"non_premium_user_{menuOption}")
|
958
|
+
PKAnalyticsService().send_event(f"non_premium_user_{menuOption}_{indexOption}_{executeOption}")
|
957
959
|
PKAnalyticsService().send_event("app_exit")
|
958
960
|
sys.exit(0)
|
959
961
|
if menuOption in ["M", "D", "I", "L", "F"]:
|
@@ -1789,6 +1791,7 @@ def main(userArgs=None,optionalFinalOutcome_df=None):
|
|
1789
1791
|
if str(indexOption).isnumeric() and int(indexOption) > 1 and executeOption <= MAX_SUPPORTED_MENU_OPTION:
|
1790
1792
|
ensureMenusLoaded(menuOption,indexOption,executeOption)
|
1791
1793
|
if not PKPremiumHandler.hasPremium(m2.find(str(executeOption).upper())):
|
1794
|
+
PKAnalyticsService().send_event(f"non_premium_user_{menuOption}_{indexOption}_{executeOption}")
|
1792
1795
|
PKAnalyticsService().send_event("app_exit")
|
1793
1796
|
sys.exit(0)
|
1794
1797
|
if (
|
@@ -1801,6 +1804,7 @@ def main(userArgs=None,optionalFinalOutcome_df=None):
|
|
1801
1804
|
try:
|
1802
1805
|
if str(indexOption).upper() in ["W", "E", "S"]:
|
1803
1806
|
if not PKPremiumHandler.hasPremium(m1.find(str(indexOption).upper())):
|
1807
|
+
PKAnalyticsService().send_event(f"non_premium_user_{menuOption}_{indexOption}_{executeOption}")
|
1804
1808
|
PKAnalyticsService().send_event("app_exit")
|
1805
1809
|
sys.exit(0)
|
1806
1810
|
if indexOption == "W":
|
@@ -2201,6 +2205,7 @@ def main(userArgs=None,optionalFinalOutcome_df=None):
|
|
2201
2205
|
OutputControls().printOutput(colorText.END, end="")
|
2202
2206
|
ensureMenusLoaded(menuOption,indexOption,executeOption)
|
2203
2207
|
if not PKPremiumHandler.hasPremium(m0.find(str(pinOption).upper())):
|
2208
|
+
PKAnalyticsService().send_event(f"non_premium_user_pin_{menuOption}_{indexOption}_{executeOption}_{pinOption}")
|
2204
2209
|
PKAnalyticsService().send_event("app_exit")
|
2205
2210
|
sys.exit(0)
|
2206
2211
|
if pinOption in ["1","2"]:
|
@@ -2868,7 +2873,8 @@ def updateMenuChoiceHierarchy():
|
|
2868
2873
|
if ((":0:" in runOptionName or "_0_" in runOptionName) and userPassedArgs.progressstatus is not None) or userPassedArgs.progressstatus is not None:
|
2869
2874
|
runOptionName = userPassedArgs.progressstatus.split("=>")[0].split(" [+] ")[1].strip()
|
2870
2875
|
reportTitle = f"{runOptionName} | {reportTitle}" if runOptionName is not None else reportTitle
|
2871
|
-
|
2876
|
+
if len(runOptionName) >= 5:
|
2877
|
+
PKAnalyticsService().send_event(runOptionName)
|
2872
2878
|
OutputControls().printOutput(
|
2873
2879
|
colorText.FAIL
|
2874
2880
|
+ f" [+] You chose: {reportTitle} "
|
@@ -311,7 +311,8 @@ argParser.add_argument(
|
|
311
311
|
help="runs and tests all options",
|
312
312
|
required=False,
|
313
313
|
)
|
314
|
-
|
314
|
+
from PKDevTools.classes.FunctionTimeouts import ping
|
315
|
+
from pkscreener.classes.PKAnalytics import PKAnalyticsService
|
315
316
|
def csv_split(s):
|
316
317
|
return list(csv.reader([s], delimiter=' '))[0]
|
317
318
|
|
@@ -918,6 +919,7 @@ def updateConfig(args):
|
|
918
919
|
configManager.duration = "1d"
|
919
920
|
configManager.setConfig(ConfigManager.parser,default=True, showFileCreatedText=False)
|
920
921
|
|
922
|
+
@ping(interval=60,instance=PKAnalyticsService())
|
921
923
|
def pkscreenercli():
|
922
924
|
global originalStdOut, args
|
923
925
|
if sys.platform.startswith("darwin"):
|
@@ -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.
|
22
|
+
PKDevTools>=0.13.20250126.240
|
23
23
|
PKNSETools>=0.1.20250122.138
|
24
24
|
Pyarrow #>=17.0.0
|
25
25
|
pyppeteer #>=2.0.0
|
@@ -1,9 +1,9 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: pkscreener
|
3
|
-
Version: 0.46.20250222.
|
3
|
+
Version: 0.46.20250222.734
|
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.20250222.
|
6
|
+
Download-URL: https://github.com/pkjmesra/pkscreener/archive/v0.46.20250222.734.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.
|
36
|
+
Requires-Dist: PKDevTools >=0.13.20250126.240
|
37
37
|
Requires-Dist: PKNSETools >=0.1.20250122.138
|
38
38
|
Requires-Dist: Pyarrow
|
39
39
|
Requires-Dist: pyppeteer
|
@@ -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.
|
383
|
+
[Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250222.733/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.
|
385
|
+
[Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250222.733/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.
|
387
|
+
[Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250222.733/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.
|
389
|
+
[Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250222.733/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.
|
391
|
+
[Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250222.733/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.20250222.734.data/purelib/pkscreener/Disclaimer.txt,sha256=kBZQSQCFfL2kc1bijXWndZzkjMTtnpH_B7XtDPPMcuw,1396
|
2
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/LICENSE-Others.txt,sha256=WBslRYLBoqYg-vr25sS1c_UI7cuUnsGk0nIQLBzTWEE,271830
|
3
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/LICENSE.txt,sha256=CdnyGrl-xRYX67ZkdERZWHr6BlTxOyg8Z8sK1XQ5Xsg,1078
|
4
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/LogoWM.txt,sha256=7Njnavpy_FKY4Iwbzv1JqsYMcOdkDSKAKXP3SAItKV0,14868
|
5
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/README.txt,sha256=_MW3nwbj-AJmAeO8uVh-n8nxeqUcnDyn4yNrhre822o,32802
|
6
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/__init__.py,sha256=aZ62qYACxsU8m8_5JkzNzos1lVFNcMGPRMgeddnUUiQ,1633
|
7
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/courbd.ttf,sha256=SKpnp-BRs7AZcdI83nencS3Q7xe0anbbP1YMOxLlEhU,791436
|
8
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/globals.py,sha256=IoOl4A_CRHCgbSNg64eJfRc1IiYP9TUrQVk6Bnr6sxw,244207
|
9
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/pkscreener.ini,sha256=QKs6j4qhyH37L_MdG3ztAIwgqs4c3qihuqDIoex-V2g,2391
|
10
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/pkscreenerbot.py,sha256=bcfUJ0qgFPsyLEkReNrYJNFMvjAoQtqDUg6ycsxVNhE,117483
|
11
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/pkscreenercli.py,sha256=fzOB28IwTgLIvPS8PQx951ga5gAO8UDP_gsIdO2FDBI,57989
|
12
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/requirements.txt,sha256=VvlpF1BWQ5egu5LD0Yr5aCicCGm0WeJOlPGArzUWa1U,1457
|
13
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/ArtTexts.py,sha256=LZ8ynyS8woliv8bM9Nq4aU0VCoJDJU0FgZk8V5zYPmg,19504
|
14
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/AssetsManager.py,sha256=sKvfM1PpM3seVZ3swKdgUTqNPb2RJhcfxqAV90eIWBw,35495
|
15
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/Backtest.py,sha256=wobBQgqVQhFNZlyJ2hgMXQqofrICc_3F0I5D66DUvGI,10530
|
16
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/Barometer.py,sha256=WPrgtIXb1nIbb-FnuRs-yvOQ5baNQRBgUR_zWg1moxk,9464
|
17
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/BaseScreeningStatistics.py,sha256=u5t1wf-HsZ8xEtprON55ehIR3F2LNNq8LvwgIrhYRmU,3000
|
18
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/CandlePatterns.py,sha256=gaswU2OeDa3JXjEafR2clUpKW5v8_1_tJuNPuTWsAss,17066
|
19
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/Changelog.py,sha256=vUOpca28OACNhavAmjBm4xco3u6fcHqWlnlmCJqO5Lk,1469
|
20
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/ConfigManager.py,sha256=THcfBgua5hr1Pv7AwEDBu2yurCNteGM04jY3Fr_MeBg,53565
|
21
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/ConsoleMenuUtility.py,sha256=fyR7dEsAaEWEe5SyaVgwLPdU4h4pI8SozUhsPZXShpg,10037
|
22
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/ConsoleUtility.py,sha256=TrEnTT4pmsBpEYdwD2oAtNqNG_drPe1LVkhthP2540I,12096
|
23
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/Fetcher.py,sha256=kPnLndeH6OYdoMRxUPjamDTXYUIsU5QjyaYEp-uNu0M,15143
|
24
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/GlobalStore.py,sha256=IzoYMybXpVVf6YwZi7j34rP-hNd7sMened8TAMu_-A8,3709
|
25
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/ImageUtility.py,sha256=mgJUzjrOKQ1mYV5P_ylhBnaF7ZgOO6ogjy22Rt49TNI,37032
|
26
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/MarketMonitor.py,sha256=uO4A84j_0wpfdjbwfAxTWjsmji4kHSjz5L8lshNOs-U,22141
|
27
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/MarketStatus.py,sha256=dNg8znbRpt7ID3U_1nmclD4zSLtveJeYeRbS0l6HLtE,3737
|
28
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/MenuOptions.py,sha256=iZb0zBs7lcP60cmuP7Z5xmXfNtTFcFH6ZWOuoileErE,64552
|
29
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/Messenger.py,sha256=peyY-YiqdC1bp-3DlJXILRa9HGYbqGVzf1wil0fYv98,8396
|
30
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/OtaUpdater.py,sha256=_7-nFAC-vAcmZ1Nwi5g5tfp7hKQQPuLUnBCOzrwC39g,13491
|
31
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/PKAnalytics.py,sha256=lFdKsUmaVGOwKJPRxbIMc6nyHj1SuiZIaNuvDXNYCKo,7438
|
32
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/PKDataService.py,sha256=BipM8Z4rS6h12cF6VWv_u4Z8ee7psMFd1yUojejW1Ag,3393
|
33
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/PKDemoHandler.py,sha256=r4KrZF8TaOu1J0nu8sUsgWEvnbndboWQQvz69GOy1Fk,2207
|
34
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/PKMarketOpenCloseAnalyser.py,sha256=T7S0DRv4Tqg77S5CyTWQUgpIAtx0NEtSVAplkynS2YM,33833
|
35
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/PKPremiumHandler.py,sha256=r16-u9fyc0ftgnSnZnz-JusTfEzyQIyKkvgbPuSd7W4,5611
|
36
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/PKScanRunner.py,sha256=zFsg2oW3vjlZYtEW3jsUS9XCTXPrL47dY5psQ9iJoIA,26795
|
37
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/PKScheduledTaskProgress.py,sha256=h19ZuxoalB50pnZjntFh12b9mBozvMqhKYq6TL18vo4,1657
|
38
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/PKScheduler.py,sha256=qThoz0yXLmHEWAiD_TdkIrzJb37b_m830JJFrkN1Tio,8814
|
39
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/PKSpreadsheets.py,sha256=1I7YGGPPY879K5JeTZ_d1FNCpjloh6TZrx91JlwT20o,8298
|
40
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/PKTask.py,sha256=4q87uD2cXvp0AbP6I73xPP39F0mfnpHQutsxxqpnxJM,1867
|
41
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/PKUserRegistration.py,sha256=SIEpkMscmUav7dXDcRUDZmlb5LeRo6b-Tx-h15ED_88,11589
|
42
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/Pktalib.py,sha256=xketnpMVDGHOFg47LFavaU-agWy370VanYWyzzuLY8c,33386
|
43
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/Portfolio.py,sha256=JZ93n3Zk9nkSFaX-lHyQiFnavHVmHPFoy-L_4gugj54,13895
|
44
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/PortfolioXRay.py,sha256=4MjXqBAVUlfN4w5tTmgEnQGMoy0hFu_uaVgrmai1fN4,48339
|
45
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/ScreeningStatistics.py,sha256=YSg4cynnDcn7cUK6VUBRpMmcNsKG3_CCzTSyobiCk2k,221479
|
46
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/StockScreener.py,sha256=vng1HlO5iB48-SoaCcxJMbKRpnKCJmyULLZg411wskQ,67563
|
47
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/StockSentiment.py,sha256=WL7TBAHDSIN5cgZ9uTbbEFnUPo4G-YIzEv16RpPGaro,3546
|
48
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/UserMenuChoicesHandler.py,sha256=_fTCscTLEjoU-n12V9237uDN6Jf8nGCvGdBVkpD3Ap4,4947
|
49
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/Utility.py,sha256=Cn_QrVH40rQWkHW2e2NolE0b18qszvGXfVLdwAqD7sM,13562
|
50
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/WorkflowManager.py,sha256=YRUiZSq83SEx2qB0wTBDE4KFaYqEz1Qu4FSCAzl6xzU,5663
|
51
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/__init__.py,sha256=morbeHBDQKDfsHfImGw80zBZzmZISR3XPalPAga4qvQ,28
|
52
|
+
pkscreener-0.46.20250222.734.data/purelib/pkscreener/classes/keys.py,sha256=LQq_t1lSh0x4TbRCIDhoCil3xctgLLeVk5f2vgrl1tk,6789
|
53
|
+
pkscreener-0.46.20250222.734.dist-info/LICENSE,sha256=CdnyGrl-xRYX67ZkdERZWHr6BlTxOyg8Z8sK1XQ5Xsg,1078
|
54
|
+
pkscreener-0.46.20250222.734.dist-info/METADATA,sha256=faxT_GFzxijfwDjwqoNgWee3OEx0zO7EdvzlCEkzmw4,34492
|
55
|
+
pkscreener-0.46.20250222.734.dist-info/WHEEL,sha256=e371LA3b7MNA0F-VeyIqNDak9eYypgZ6oD_mcY6JoTQ,110
|
56
|
+
pkscreener-0.46.20250222.734.dist-info/entry_points.txt,sha256=Pm30xm4sU7YFtFJUC-Te8VlqOvYAvWKFFA5AfQE0xGY,120
|
57
|
+
pkscreener-0.46.20250222.734.dist-info/top_level.txt,sha256=oIfcPPw58Q4KU-GDqp25dXbrtvxYXJBCo_em6i5aVvY,11
|
58
|
+
pkscreener-0.46.20250222.734.dist-info/RECORD,,
|
@@ -1 +0,0 @@
|
|
1
|
-
VERSION='0.46.20250222.732'
|
@@ -1,58 +0,0 @@
|
|
1
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/Disclaimer.txt,sha256=kBZQSQCFfL2kc1bijXWndZzkjMTtnpH_B7XtDPPMcuw,1396
|
2
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/LICENSE-Others.txt,sha256=WBslRYLBoqYg-vr25sS1c_UI7cuUnsGk0nIQLBzTWEE,271830
|
3
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/LICENSE.txt,sha256=CdnyGrl-xRYX67ZkdERZWHr6BlTxOyg8Z8sK1XQ5Xsg,1078
|
4
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/LogoWM.txt,sha256=7Njnavpy_FKY4Iwbzv1JqsYMcOdkDSKAKXP3SAItKV0,14868
|
5
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/README.txt,sha256=8cxqCkorzAzJFH0tN_B6zMukxlrbzgOi_aqPhpC2_U4,32802
|
6
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/__init__.py,sha256=aZ62qYACxsU8m8_5JkzNzos1lVFNcMGPRMgeddnUUiQ,1633
|
7
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/courbd.ttf,sha256=SKpnp-BRs7AZcdI83nencS3Q7xe0anbbP1YMOxLlEhU,791436
|
8
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/globals.py,sha256=N0beEkoGuveA2QAlrtmSTDdWlAJsLyX8jBohccaSIHQ,243495
|
9
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/pkscreener.ini,sha256=QKs6j4qhyH37L_MdG3ztAIwgqs4c3qihuqDIoex-V2g,2391
|
10
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/pkscreenerbot.py,sha256=bcfUJ0qgFPsyLEkReNrYJNFMvjAoQtqDUg6ycsxVNhE,117483
|
11
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/pkscreenercli.py,sha256=-2cgfdCUJhp4xeZfcbj2ntUp_MvsrVJvz1dnsOBQMZA,57826
|
12
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/requirements.txt,sha256=WAgAA0Jnagag0KWNFcM9wspRO23SRkb9F5Fo3ceW3Os,1457
|
13
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/ArtTexts.py,sha256=LZ8ynyS8woliv8bM9Nq4aU0VCoJDJU0FgZk8V5zYPmg,19504
|
14
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/AssetsManager.py,sha256=5pyXH-9KZszQP5uI4_6XR8QMny1sEHBhpRzsmP0Rhe0,35465
|
15
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/Backtest.py,sha256=wobBQgqVQhFNZlyJ2hgMXQqofrICc_3F0I5D66DUvGI,10530
|
16
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/Barometer.py,sha256=WPrgtIXb1nIbb-FnuRs-yvOQ5baNQRBgUR_zWg1moxk,9464
|
17
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/BaseScreeningStatistics.py,sha256=u5t1wf-HsZ8xEtprON55ehIR3F2LNNq8LvwgIrhYRmU,3000
|
18
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/CandlePatterns.py,sha256=gaswU2OeDa3JXjEafR2clUpKW5v8_1_tJuNPuTWsAss,17066
|
19
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/Changelog.py,sha256=vUOpca28OACNhavAmjBm4xco3u6fcHqWlnlmCJqO5Lk,1469
|
20
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/ConfigManager.py,sha256=THcfBgua5hr1Pv7AwEDBu2yurCNteGM04jY3Fr_MeBg,53565
|
21
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/ConsoleMenuUtility.py,sha256=fyR7dEsAaEWEe5SyaVgwLPdU4h4pI8SozUhsPZXShpg,10037
|
22
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/ConsoleUtility.py,sha256=TrEnTT4pmsBpEYdwD2oAtNqNG_drPe1LVkhthP2540I,12096
|
23
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/Fetcher.py,sha256=3-6x_XoHDzMk5HV40oMS-8hYXRSJ-BaDdfB0KIDnb4c,14766
|
24
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/GlobalStore.py,sha256=IzoYMybXpVVf6YwZi7j34rP-hNd7sMened8TAMu_-A8,3709
|
25
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/ImageUtility.py,sha256=mgJUzjrOKQ1mYV5P_ylhBnaF7ZgOO6ogjy22Rt49TNI,37032
|
26
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/MarketMonitor.py,sha256=uO4A84j_0wpfdjbwfAxTWjsmji4kHSjz5L8lshNOs-U,22141
|
27
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/MarketStatus.py,sha256=dNg8znbRpt7ID3U_1nmclD4zSLtveJeYeRbS0l6HLtE,3737
|
28
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/MenuOptions.py,sha256=iZb0zBs7lcP60cmuP7Z5xmXfNtTFcFH6ZWOuoileErE,64552
|
29
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/Messenger.py,sha256=peyY-YiqdC1bp-3DlJXILRa9HGYbqGVzf1wil0fYv98,8396
|
30
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/OtaUpdater.py,sha256=_7-nFAC-vAcmZ1Nwi5g5tfp7hKQQPuLUnBCOzrwC39g,13491
|
31
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/PKAnalytics.py,sha256=6M1QMe8jX6R6kUUQxg8UClYFNmD7lwm7CxPigGNBYj0,6885
|
32
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/PKDataService.py,sha256=BipM8Z4rS6h12cF6VWv_u4Z8ee7psMFd1yUojejW1Ag,3393
|
33
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/PKDemoHandler.py,sha256=r4KrZF8TaOu1J0nu8sUsgWEvnbndboWQQvz69GOy1Fk,2207
|
34
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/PKMarketOpenCloseAnalyser.py,sha256=T7S0DRv4Tqg77S5CyTWQUgpIAtx0NEtSVAplkynS2YM,33833
|
35
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/PKPremiumHandler.py,sha256=r16-u9fyc0ftgnSnZnz-JusTfEzyQIyKkvgbPuSd7W4,5611
|
36
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/PKScanRunner.py,sha256=EPLo2euBMfA9omnqrr5pXv2h9KzTcPZM-PXRFI26LSo,26791
|
37
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/PKScheduledTaskProgress.py,sha256=h19ZuxoalB50pnZjntFh12b9mBozvMqhKYq6TL18vo4,1657
|
38
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/PKScheduler.py,sha256=qThoz0yXLmHEWAiD_TdkIrzJb37b_m830JJFrkN1Tio,8814
|
39
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/PKSpreadsheets.py,sha256=1I7YGGPPY879K5JeTZ_d1FNCpjloh6TZrx91JlwT20o,8298
|
40
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/PKTask.py,sha256=4q87uD2cXvp0AbP6I73xPP39F0mfnpHQutsxxqpnxJM,1867
|
41
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/PKUserRegistration.py,sha256=SIEpkMscmUav7dXDcRUDZmlb5LeRo6b-Tx-h15ED_88,11589
|
42
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/Pktalib.py,sha256=xketnpMVDGHOFg47LFavaU-agWy370VanYWyzzuLY8c,33386
|
43
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/Portfolio.py,sha256=JZ93n3Zk9nkSFaX-lHyQiFnavHVmHPFoy-L_4gugj54,13895
|
44
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/PortfolioXRay.py,sha256=4MjXqBAVUlfN4w5tTmgEnQGMoy0hFu_uaVgrmai1fN4,48339
|
45
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/ScreeningStatistics.py,sha256=YSg4cynnDcn7cUK6VUBRpMmcNsKG3_CCzTSyobiCk2k,221479
|
46
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/StockScreener.py,sha256=F0SWa1DSTgYdSWnkPTR9kmOKgHLtaqNMCtJP8yZkDnE,67252
|
47
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/StockSentiment.py,sha256=WL7TBAHDSIN5cgZ9uTbbEFnUPo4G-YIzEv16RpPGaro,3546
|
48
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/UserMenuChoicesHandler.py,sha256=_fTCscTLEjoU-n12V9237uDN6Jf8nGCvGdBVkpD3Ap4,4947
|
49
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/Utility.py,sha256=Cn_QrVH40rQWkHW2e2NolE0b18qszvGXfVLdwAqD7sM,13562
|
50
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/WorkflowManager.py,sha256=YRUiZSq83SEx2qB0wTBDE4KFaYqEz1Qu4FSCAzl6xzU,5663
|
51
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/__init__.py,sha256=PL-XYrao51eqk5S3pzsuS3QyzZlr24JMsAWWfq5Dm1Q,28
|
52
|
-
pkscreener-0.46.20250222.732.data/purelib/pkscreener/classes/keys.py,sha256=LQq_t1lSh0x4TbRCIDhoCil3xctgLLeVk5f2vgrl1tk,6789
|
53
|
-
pkscreener-0.46.20250222.732.dist-info/LICENSE,sha256=CdnyGrl-xRYX67ZkdERZWHr6BlTxOyg8Z8sK1XQ5Xsg,1078
|
54
|
-
pkscreener-0.46.20250222.732.dist-info/METADATA,sha256=zrt49rIfP7H33vOqFuJwCF_VeJZgtdyDAi0U00PubTc,34492
|
55
|
-
pkscreener-0.46.20250222.732.dist-info/WHEEL,sha256=e371LA3b7MNA0F-VeyIqNDak9eYypgZ6oD_mcY6JoTQ,110
|
56
|
-
pkscreener-0.46.20250222.732.dist-info/entry_points.txt,sha256=Pm30xm4sU7YFtFJUC-Te8VlqOvYAvWKFFA5AfQE0xGY,120
|
57
|
-
pkscreener-0.46.20250222.732.dist-info/top_level.txt,sha256=oIfcPPw58Q4KU-GDqp25dXbrtvxYXJBCo_em6i5aVvY,11
|
58
|
-
pkscreener-0.46.20250222.732.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{pkscreener-0.46.20250222.732.dist-info → pkscreener-0.46.20250222.734.dist-info}/entry_points.txt
RENAMED
File without changes
|
{pkscreener-0.46.20250222.732.dist-info → pkscreener-0.46.20250222.734.dist-info}/top_level.txt
RENAMED
File without changes
|