webtoolkit 0.1.70__tar.gz → 0.1.71__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.
Files changed (57) hide show
  1. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/PKG-INFO +1 -1
  2. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/pyproject.toml +1 -1
  3. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/handlers/defaulturlhandler.py +29 -26
  4. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/handlers/handlers.py +22 -3
  5. webtoolkit-0.1.71/webtoolkit/tests/fake/githubcom.py +459 -0
  6. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/tests/fakeresponse.py +4 -0
  7. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/urllocation.py +3 -1
  8. webtoolkit-0.1.70/webtoolkit/tests/fake/githubcom.py +0 -128
  9. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/LICENSE +0 -0
  10. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/README.md +0 -0
  11. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/__init__.py +0 -0
  12. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/baseurl.py +0 -0
  13. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/contentinterface.py +0 -0
  14. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/contentlinkparser.py +0 -0
  15. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/contentmoderation.py +0 -0
  16. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/contenttext.py +0 -0
  17. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/crawlers/__init__.py +0 -0
  18. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/crawlers/crawlerinterface.py +0 -0
  19. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/crawlers/requestscrawler.py +0 -0
  20. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/domaincache.py +0 -0
  21. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/handlers/__init__.py +0 -0
  22. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/handlers/handlerchannelodysee.py +0 -0
  23. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/handlers/handlerchannelyoutube.py +0 -0
  24. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/handlers/handlerhttppage.py +0 -0
  25. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/handlers/handlerinterface.py +0 -0
  26. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/handlers/handlervideoodysee.py +0 -0
  27. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/handlers/handlervideoyoutube.py +0 -0
  28. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/pages.py +0 -0
  29. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/remoteserver.py +0 -0
  30. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/remoteurl.py +0 -0
  31. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/request.py +0 -0
  32. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/response.py +0 -0
  33. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/statuses.py +0 -0
  34. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/tests/__init__.py +0 -0
  35. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/tests/fake/__init__.py +0 -0
  36. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/tests/fake/codeproject.py +0 -0
  37. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/tests/fake/firebog.py +0 -0
  38. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/tests/fake/geekwirecom.py +0 -0
  39. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/tests/fake/hackernews.py +0 -0
  40. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/tests/fake/instance.py +0 -0
  41. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/tests/fake/opmlfile.py +0 -0
  42. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/tests/fake/reddit.py +0 -0
  43. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/tests/fake/returndislike.py +0 -0
  44. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/tests/fake/robotstxtcom.py +0 -0
  45. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/tests/fake/thehill.py +0 -0
  46. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/tests/fake/warhammercommunity.py +0 -0
  47. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/tests/fake/youtube.py +0 -0
  48. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/tests/fakeinternet.py +0 -0
  49. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/tests/fakeinternetcontents.py +0 -0
  50. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/tests/mocks.py +0 -0
  51. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/utils/__init__.py +0 -0
  52. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/utils/dateutils.py +0 -0
  53. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/utils/emailreader.py +0 -0
  54. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/utils/logger.py +0 -0
  55. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/utils/memorychecker.py +0 -0
  56. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/webconfig.py +0 -0
  57. {webtoolkit-0.1.70 → webtoolkit-0.1.71}/webtoolkit/webtools.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: webtoolkit
3
- Version: 0.1.70
3
+ Version: 0.1.71
4
4
  Summary: Web tools and interfaces for Internet data processing.
5
5
  License: GPL3
6
6
  Author: Iwan Grozny
@@ -3,7 +3,7 @@
3
3
 
4
4
  [tool.poetry]
5
5
  name = "webtoolkit"
6
- version = "0.1.70"
6
+ version = "0.1.71"
7
7
  description = "Web tools and interfaces for Internet data processing."
8
8
  authors = ["Iwan Grozny <renegat@renegat0x0.ddns.net>"]
9
9
  license = "GPL3"
@@ -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.channel_sources_urls = OrderedDict()
113
+ self.all_urls_to_fetch = OrderedDict()
114
114
  super().__init__(url=url, request=request, url_builder=url_builder)
115
115
 
116
- def get_channel_sources(self):
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.get_channel_sources())
184
+ return self.get_responses_implementation(self.get_urls_to_fetch())
182
185
 
183
- def get_responses_implementation(self, channel_sources):
186
+ def get_responses_implementation(self, urls_to_fetch):
184
187
  handles = []
185
188
  with ThreadPoolExecutor() as executor:
186
- for channel_source in channel_sources:
187
- if channel_source not in self.channel_sources_urls:
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, channel_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.channel_sources_urls[url.url] = url
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.channel_sources_urls.values():
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.channel_sources_urls.values():
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.channel_sources_urls.values():
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.channel_sources_urls.values():
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.channel_sources_urls.values():
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.channel_sources_urls.values():
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.channel_sources_urls.values():
248
- return self.channel_sources_urls[page_url]
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.channel_sources_urls.values():
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.channel_sources_urls.values():
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.channel_sources_urls.values():
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.channel_sources_urls.values():
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.channel_sources_urls.values():
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.channel_sources_urls.values():
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.channel_sources_urls.values():
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.channel_sources_urls.values():
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.channel_sources_urls.values():
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.channel_sources_urls.values():
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 ..urllocation import UrlLocation
4
- from ..pages import RssPage
5
- from ..webtools import WebLogger
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,23 @@ 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
+
288
307
 
289
308
  class ReturnDislike(DefaultUrlHandler):
290
309
  def __init__(