webtoolkit 0.1.70__tar.gz → 0.1.72__tar.gz
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.
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/PKG-INFO +1 -1
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/pyproject.toml +1 -1
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/handlers/defaulturlhandler.py +29 -26
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/handlers/handlers.py +29 -3
- webtoolkit-0.1.72/webtoolkit/tests/fake/githubcom.py +459 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/tests/fakeresponse.py +4 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/urllocation.py +3 -1
- webtoolkit-0.1.70/webtoolkit/tests/fake/githubcom.py +0 -128
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/LICENSE +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/README.md +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/__init__.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/baseurl.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/contentinterface.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/contentlinkparser.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/contentmoderation.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/contenttext.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/crawlers/__init__.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/crawlers/crawlerinterface.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/crawlers/requestscrawler.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/domaincache.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/handlers/__init__.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/handlers/handlerchannelodysee.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/handlers/handlerchannelyoutube.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/handlers/handlerhttppage.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/handlers/handlerinterface.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/handlers/handlervideoodysee.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/handlers/handlervideoyoutube.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/pages.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/remoteserver.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/remoteurl.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/request.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/response.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/statuses.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/tests/__init__.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/tests/fake/__init__.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/tests/fake/codeproject.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/tests/fake/firebog.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/tests/fake/geekwirecom.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/tests/fake/hackernews.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/tests/fake/instance.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/tests/fake/opmlfile.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/tests/fake/reddit.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/tests/fake/returndislike.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/tests/fake/robotstxtcom.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/tests/fake/thehill.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/tests/fake/warhammercommunity.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/tests/fake/youtube.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/tests/fakeinternet.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/tests/fakeinternetcontents.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/tests/mocks.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/utils/__init__.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/utils/dateutils.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/utils/emailreader.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/utils/logger.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/utils/memorychecker.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/webconfig.py +0 -0
- {webtoolkit-0.1.70 → webtoolkit-0.1.72}/webtoolkit/webtools.py +0 -0
|
@@ -110,10 +110,13 @@ class DefaultCompoundChannelHandler(DefaultChannelHandler):
|
|
|
110
110
|
|
|
111
111
|
def __init__(self, url=None, contents=None, request=None, url_builder=None):
|
|
112
112
|
self.responses = []
|
|
113
|
-
self.
|
|
113
|
+
self.all_urls_to_fetch = OrderedDict()
|
|
114
114
|
super().__init__(url=url, request=request, url_builder=url_builder)
|
|
115
115
|
|
|
116
|
-
def
|
|
116
|
+
def get_urls_to_fetch(self):
|
|
117
|
+
"""
|
|
118
|
+
API that returns which urls will be fetched
|
|
119
|
+
"""
|
|
117
120
|
sources = []
|
|
118
121
|
|
|
119
122
|
feeds = self.get_feeds()
|
|
@@ -178,15 +181,15 @@ class DefaultCompoundChannelHandler(DefaultChannelHandler):
|
|
|
178
181
|
if self.responses and len(self.responses) > 0:
|
|
179
182
|
return self.responses
|
|
180
183
|
|
|
181
|
-
return self.get_responses_implementation(self.
|
|
184
|
+
return self.get_responses_implementation(self.get_urls_to_fetch())
|
|
182
185
|
|
|
183
|
-
def get_responses_implementation(self,
|
|
186
|
+
def get_responses_implementation(self, urls_to_fetch):
|
|
184
187
|
handles = []
|
|
185
188
|
with ThreadPoolExecutor() as executor:
|
|
186
|
-
for
|
|
187
|
-
if
|
|
189
|
+
for url_to_fetch in urls_to_fetch:
|
|
190
|
+
if url_to_fetch not in self.all_urls_to_fetch:
|
|
188
191
|
handles.append(
|
|
189
|
-
executor.submit(self.get_response_source,
|
|
192
|
+
executor.submit(self.get_response_source, url_to_fetch)
|
|
190
193
|
)
|
|
191
194
|
|
|
192
195
|
for handle in handles:
|
|
@@ -195,12 +198,12 @@ class DefaultCompoundChannelHandler(DefaultChannelHandler):
|
|
|
195
198
|
|
|
196
199
|
url.get_response()
|
|
197
200
|
|
|
198
|
-
self.
|
|
201
|
+
self.all_urls_to_fetch[url.url] = url
|
|
199
202
|
except Exception as E:
|
|
200
203
|
WebLogger.exc(E)
|
|
201
204
|
|
|
202
205
|
# we capture responses using order of urls
|
|
203
|
-
for page_url in self.
|
|
206
|
+
for page_url in self.all_urls_to_fetch.values():
|
|
204
207
|
if page_url:
|
|
205
208
|
self.responses.append(page_url.get_response())
|
|
206
209
|
|
|
@@ -208,7 +211,7 @@ class DefaultCompoundChannelHandler(DefaultChannelHandler):
|
|
|
208
211
|
|
|
209
212
|
def is_valid(self):
|
|
210
213
|
is_valid = True
|
|
211
|
-
for page_url in self.
|
|
214
|
+
for page_url in self.all_urls_to_fetch.values():
|
|
212
215
|
response = url.get_response()
|
|
213
216
|
if not response.is_valid():
|
|
214
217
|
is_valid = False
|
|
@@ -216,7 +219,7 @@ class DefaultCompoundChannelHandler(DefaultChannelHandler):
|
|
|
216
219
|
|
|
217
220
|
def is_invalid(self):
|
|
218
221
|
is_invalid = True
|
|
219
|
-
for page_url in self.
|
|
222
|
+
for page_url in self.all_urls_to_fetch.values():
|
|
220
223
|
response = url.get_response()
|
|
221
224
|
if not response.is_invalid():
|
|
222
225
|
is_invalid = False
|
|
@@ -224,7 +227,7 @@ class DefaultCompoundChannelHandler(DefaultChannelHandler):
|
|
|
224
227
|
|
|
225
228
|
def get_hash(self):
|
|
226
229
|
text = ""
|
|
227
|
-
for page_url in self.
|
|
230
|
+
for page_url in self.all_urls_to_fetch.values():
|
|
228
231
|
response = page_url.get_response()
|
|
229
232
|
text += str(response.get_text())
|
|
230
233
|
return calculate_hash(text)
|
|
@@ -232,20 +235,20 @@ class DefaultCompoundChannelHandler(DefaultChannelHandler):
|
|
|
232
235
|
def get_feeds(self):
|
|
233
236
|
feeds = set()
|
|
234
237
|
|
|
235
|
-
for page_url in self.
|
|
238
|
+
for page_url in self.all_urls_to_fetch.values():
|
|
236
239
|
feeds.update(page_url.get_feeds())
|
|
237
240
|
|
|
238
241
|
return list(feeds)
|
|
239
242
|
|
|
240
243
|
def get_streams(self):
|
|
241
|
-
for page_url in self.
|
|
244
|
+
for page_url in self.all_urls_to_fetch.values():
|
|
242
245
|
self.streams[page_url.url] = page_url.get_response()
|
|
243
246
|
|
|
244
247
|
return self.streams
|
|
245
248
|
|
|
246
249
|
def get_response_source(self, page_url):
|
|
247
|
-
if page_url in self.
|
|
248
|
-
return self.
|
|
250
|
+
if page_url in self.all_urls_to_fetch.values():
|
|
251
|
+
return self.all_urls_to_fetch[page_url]
|
|
249
252
|
|
|
250
253
|
url = self.build_http_url(page_url)
|
|
251
254
|
if url:
|
|
@@ -254,62 +257,62 @@ class DefaultCompoundChannelHandler(DefaultChannelHandler):
|
|
|
254
257
|
return url
|
|
255
258
|
|
|
256
259
|
def get_entries(self):
|
|
257
|
-
for url in self.
|
|
260
|
+
for url in self.all_urls_to_fetch.values():
|
|
258
261
|
entries = url.get_entries()
|
|
259
262
|
if entries and len(list(entries)) > 0:
|
|
260
263
|
return entries
|
|
261
264
|
return []
|
|
262
265
|
|
|
263
266
|
def get_title(self):
|
|
264
|
-
for url in self.
|
|
267
|
+
for url in self.all_urls_to_fetch.values():
|
|
265
268
|
title = url.get_title()
|
|
266
269
|
if title:
|
|
267
270
|
return title
|
|
268
271
|
|
|
269
272
|
def get_description(self):
|
|
270
|
-
for url in self.
|
|
273
|
+
for url in self.all_urls_to_fetch.values():
|
|
271
274
|
description = url.get_description()
|
|
272
275
|
if description:
|
|
273
276
|
return description
|
|
274
277
|
|
|
275
278
|
def get_language(self):
|
|
276
|
-
for url in self.
|
|
279
|
+
for url in self.all_urls_to_fetch.values():
|
|
277
280
|
language = url.get_language()
|
|
278
281
|
if language:
|
|
279
282
|
return language
|
|
280
283
|
|
|
281
284
|
def get_thumbnail(self):
|
|
282
|
-
for url in self.
|
|
285
|
+
for url in self.all_urls_to_fetch.values():
|
|
283
286
|
thumbnail = url.get_thumbnail()
|
|
284
287
|
if thumbnail:
|
|
285
288
|
return thumbnail
|
|
286
289
|
|
|
287
290
|
def get_author(self):
|
|
288
|
-
for url in self.
|
|
291
|
+
for url in self.all_urls_to_fetch.values():
|
|
289
292
|
author = url.get_author()
|
|
290
293
|
if author:
|
|
291
294
|
return author
|
|
292
295
|
|
|
293
296
|
def get_album(self):
|
|
294
|
-
for url in self.
|
|
297
|
+
for url in self.all_urls_to_fetch.values():
|
|
295
298
|
album = url.get_author()
|
|
296
299
|
if album:
|
|
297
300
|
return album
|
|
298
301
|
|
|
299
302
|
def get_tags(self):
|
|
300
|
-
for url in self.
|
|
303
|
+
for url in self.all_urls_to_fetch.values():
|
|
301
304
|
tags = url.get_tags()
|
|
302
305
|
if tags:
|
|
303
306
|
return tags
|
|
304
307
|
|
|
305
308
|
def get_date_published(self):
|
|
306
|
-
for url in self.
|
|
309
|
+
for url in self.all_urls_to_fetch.values():
|
|
307
310
|
date_published = url.get_date_published()
|
|
308
311
|
if date_published:
|
|
309
312
|
return date_published
|
|
310
313
|
|
|
311
314
|
def close(self):
|
|
312
|
-
for page_url in self.
|
|
315
|
+
for page_url in self.all_urls_to_fetch.values():
|
|
313
316
|
page_url.close()
|
|
314
317
|
|
|
315
318
|
super().close()
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import json
|
|
2
2
|
|
|
3
|
-
from
|
|
4
|
-
from
|
|
5
|
-
from
|
|
3
|
+
from webtoolkit.urllocation import UrlLocation
|
|
4
|
+
from webtoolkit.pages import RssPage
|
|
5
|
+
from webtoolkit.webtools import WebLogger
|
|
6
|
+
from webtoolkit.utils.dateutils import DateUtils
|
|
7
|
+
|
|
6
8
|
from .defaulturlhandler import DefaultUrlHandler, DefaultChannelHandler
|
|
7
9
|
from .handlerhttppage import HttpPageHandler
|
|
8
10
|
|
|
@@ -285,6 +287,30 @@ class GitHubUrlHandler(DefaultUrlHandler):
|
|
|
285
287
|
"""
|
|
286
288
|
return None
|
|
287
289
|
|
|
290
|
+
def get_date_published(self):
|
|
291
|
+
"""
|
|
292
|
+
It would be best to fetch JSON, and cleanly extract it.
|
|
293
|
+
It will cost us additional fetch request, so we do it brutally.
|
|
294
|
+
"""
|
|
295
|
+
response = self.get_response()
|
|
296
|
+
if response:
|
|
297
|
+
text = response.get_text()
|
|
298
|
+
if text:
|
|
299
|
+
created_text = ',createdAt:"'
|
|
300
|
+
wh = text.find(created_text)
|
|
301
|
+
if wh >= 0:
|
|
302
|
+
wh2 = text.find('"', wh + len(created_text) + 1)
|
|
303
|
+
if wh2 >= 0:
|
|
304
|
+
date = text[wh + len(created_text) : wh2]
|
|
305
|
+
return DateUtils.parse_datetime(date)
|
|
306
|
+
created_text = '"createdAt":"'
|
|
307
|
+
wh = text.find(created_text)
|
|
308
|
+
if wh >= 0:
|
|
309
|
+
wh2 = text.find('"', wh + len(created_text) + 1)
|
|
310
|
+
if wh2 >= 0:
|
|
311
|
+
date = text[wh + len(created_text) : wh2]
|
|
312
|
+
return DateUtils.parse_datetime(date)
|
|
313
|
+
|
|
288
314
|
|
|
289
315
|
class ReturnDislike(DefaultUrlHandler):
|
|
290
316
|
def __init__(
|