dimples 1.4.1__tar.gz → 1.4.2__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 (173) hide show
  1. {dimples-1.4.1 → dimples-1.4.2}/PKG-INFO +1 -1
  2. {dimples-1.4.1 → dimples-1.4.2}/dimples/__init__.py +1 -1
  3. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/__init__.py +2 -2
  4. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_base.py +10 -10
  5. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_group.py +3 -3
  6. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_group_history.py +1 -1
  7. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_group_keys.py +1 -1
  8. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_meta.py +1 -1
  9. {dimples-1.4.1 → dimples-1.4.2}/dimples/utils/config.py +47 -14
  10. {dimples-1.4.1 → dimples-1.4.2}/dimples/utils/http.py +4 -6
  11. {dimples-1.4.1 → dimples-1.4.2}/dimples/utils/log.py +20 -0
  12. {dimples-1.4.1 → dimples-1.4.2}/dimples.egg-info/PKG-INFO +1 -1
  13. {dimples-1.4.1 → dimples-1.4.2}/setup.py +1 -1
  14. {dimples-1.4.1 → dimples-1.4.2}/LICENSE +0 -0
  15. {dimples-1.4.1 → dimples-1.4.2}/README.md +0 -0
  16. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/__init__.py +0 -0
  17. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/checker.py +0 -0
  18. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/checkpoint.py +0 -0
  19. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/__init__.py +0 -0
  20. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/commands.py +0 -0
  21. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/creator.py +0 -0
  22. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/customized.py +0 -0
  23. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/group.py +0 -0
  24. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/grp_expel.py +0 -0
  25. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/grp_invite.py +0 -0
  26. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/grp_join.py +0 -0
  27. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/grp_query.py +0 -0
  28. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/grp_quit.py +0 -0
  29. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/grp_reset.py +0 -0
  30. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/grp_resign.py +0 -0
  31. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/handshake.py +0 -0
  32. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/facebook.py +0 -0
  33. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/messenger.py +0 -0
  34. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/network/__init__.py +0 -0
  35. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/network/session.py +0 -0
  36. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/network/state.py +0 -0
  37. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/network/transition.py +0 -0
  38. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/packer.py +0 -0
  39. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/processor.py +0 -0
  40. {dimples-1.4.1 → dimples-1.4.2}/dimples/client/terminal.py +0 -0
  41. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/__init__.py +0 -0
  42. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/anonymous.py +0 -0
  43. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/ans.py +0 -0
  44. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/archivist.py +0 -0
  45. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/checker.py +0 -0
  46. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/compat/__init__.py +0 -0
  47. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/compat/address.py +0 -0
  48. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/compat/compatible.py +0 -0
  49. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/compat/entity.py +0 -0
  50. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/compat/loader.py +0 -0
  51. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/compat/meta.py +0 -0
  52. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/compat/network.py +0 -0
  53. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/dbi/__init__.py +0 -0
  54. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/dbi/account.py +0 -0
  55. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/dbi/message.py +0 -0
  56. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/dbi/session.py +0 -0
  57. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/facebook.py +0 -0
  58. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/messenger.py +0 -0
  59. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/packer.py +0 -0
  60. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/processer.py +0 -0
  61. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/__init__.py +0 -0
  62. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/ans.py +0 -0
  63. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/block.py +0 -0
  64. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/customized.py +0 -0
  65. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/group.py +0 -0
  66. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/handshake.py +0 -0
  67. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/login.py +0 -0
  68. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/mute.py +0 -0
  69. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/password.py +0 -0
  70. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/report.py +0 -0
  71. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/utils.py +0 -0
  72. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/version.py +0 -0
  73. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/queue.py +0 -0
  74. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/register.py +0 -0
  75. {dimples-1.4.1 → dimples-1.4.2}/dimples/common/session.py +0 -0
  76. {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/__init__.py +0 -0
  77. {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/flexible.py +0 -0
  78. {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/gate.py +0 -0
  79. {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/gatekeeper.py +0 -0
  80. {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/mars.py +0 -0
  81. {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/mtp.py +0 -0
  82. {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/protocol/__init__.py +0 -0
  83. {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/protocol/mars.py +0 -0
  84. {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/protocol/ws.py +0 -0
  85. {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/queue.py +0 -0
  86. {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/seeker.py +0 -0
  87. {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/session.py +0 -0
  88. {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/ws.py +0 -0
  89. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/account.py +0 -0
  90. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/__init__.py +0 -0
  91. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/base.py +0 -0
  92. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/document.py +0 -0
  93. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/group.py +0 -0
  94. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/group_history.py +0 -0
  95. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/group_keys.py +0 -0
  96. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/login.py +0 -0
  97. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/meta.py +0 -0
  98. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/private.py +0 -0
  99. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/station.py +0 -0
  100. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/user.py +0 -0
  101. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/message.py +0 -0
  102. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/__init__.py +0 -0
  103. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/base.py +0 -0
  104. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/document.py +0 -0
  105. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/group.py +0 -0
  106. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/grp_history.py +0 -0
  107. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/grp_keys.py +0 -0
  108. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/login.py +0 -0
  109. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/message.py +0 -0
  110. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/meta.py +0 -0
  111. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/station.py +0 -0
  112. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/user.py +0 -0
  113. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/session.py +0 -0
  114. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_cipherkey.py +0 -0
  115. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_document.py +0 -0
  116. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_login.py +0 -0
  117. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_message.py +0 -0
  118. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_private.py +0 -0
  119. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_station.py +0 -0
  120. {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_user.py +0 -0
  121. {dimples-1.4.1 → dimples-1.4.2}/dimples/edge/__init__.py +0 -0
  122. {dimples-1.4.1 → dimples-1.4.2}/dimples/edge/messenger.py +0 -0
  123. {dimples-1.4.1 → dimples-1.4.2}/dimples/edge/octopus.py +0 -0
  124. {dimples-1.4.1 → dimples-1.4.2}/dimples/edge/shared.py +0 -0
  125. {dimples-1.4.1 → dimples-1.4.2}/dimples/edge/start.py +0 -0
  126. {dimples-1.4.1 → dimples-1.4.2}/dimples/emitter.py +0 -0
  127. {dimples-1.4.1 → dimples-1.4.2}/dimples/group/__init__.py +0 -0
  128. {dimples-1.4.1 → dimples-1.4.2}/dimples/group/admin.py +0 -0
  129. {dimples-1.4.1 → dimples-1.4.2}/dimples/group/builder.py +0 -0
  130. {dimples-1.4.1 → dimples-1.4.2}/dimples/group/delegate.py +0 -0
  131. {dimples-1.4.1 → dimples-1.4.2}/dimples/group/emitter.py +0 -0
  132. {dimples-1.4.1 → dimples-1.4.2}/dimples/group/helper.py +0 -0
  133. {dimples-1.4.1 → dimples-1.4.2}/dimples/group/manager.py +0 -0
  134. {dimples-1.4.1 → dimples-1.4.2}/dimples/group/packer.py +0 -0
  135. {dimples-1.4.1 → dimples-1.4.2}/dimples/group/shared.py +0 -0
  136. {dimples-1.4.1 → dimples-1.4.2}/dimples/register/__init__.py +0 -0
  137. {dimples-1.4.1 → dimples-1.4.2}/dimples/register/base.py +0 -0
  138. {dimples-1.4.1 → dimples-1.4.2}/dimples/register/ext.py +0 -0
  139. {dimples-1.4.1 → dimples-1.4.2}/dimples/register/run.py +0 -0
  140. {dimples-1.4.1 → dimples-1.4.2}/dimples/register/shared.py +0 -0
  141. {dimples-1.4.1 → dimples-1.4.2}/dimples/server/__init__.py +0 -0
  142. {dimples-1.4.1 → dimples-1.4.2}/dimples/server/checker.py +0 -0
  143. {dimples-1.4.1 → dimples-1.4.2}/dimples/server/cpu/__init__.py +0 -0
  144. {dimples-1.4.1 → dimples-1.4.2}/dimples/server/cpu/ans.py +0 -0
  145. {dimples-1.4.1 → dimples-1.4.2}/dimples/server/cpu/creator.py +0 -0
  146. {dimples-1.4.1 → dimples-1.4.2}/dimples/server/cpu/document.py +0 -0
  147. {dimples-1.4.1 → dimples-1.4.2}/dimples/server/cpu/handshake.py +0 -0
  148. {dimples-1.4.1 → dimples-1.4.2}/dimples/server/cpu/login.py +0 -0
  149. {dimples-1.4.1 → dimples-1.4.2}/dimples/server/cpu/report.py +0 -0
  150. {dimples-1.4.1 → dimples-1.4.2}/dimples/server/deliver.py +0 -0
  151. {dimples-1.4.1 → dimples-1.4.2}/dimples/server/dis_roamer.py +0 -0
  152. {dimples-1.4.1 → dimples-1.4.2}/dimples/server/dispatcher.py +0 -0
  153. {dimples-1.4.1 → dimples-1.4.2}/dimples/server/facebook.py +0 -0
  154. {dimples-1.4.1 → dimples-1.4.2}/dimples/server/messenger.py +0 -0
  155. {dimples-1.4.1 → dimples-1.4.2}/dimples/server/packer.py +0 -0
  156. {dimples-1.4.1 → dimples-1.4.2}/dimples/server/processor.py +0 -0
  157. {dimples-1.4.1 → dimples-1.4.2}/dimples/server/push.py +0 -0
  158. {dimples-1.4.1 → dimples-1.4.2}/dimples/server/session.py +0 -0
  159. {dimples-1.4.1 → dimples-1.4.2}/dimples/server/session_center.py +0 -0
  160. {dimples-1.4.1 → dimples-1.4.2}/dimples/server/trace.py +0 -0
  161. {dimples-1.4.1 → dimples-1.4.2}/dimples/station/__init__.py +0 -0
  162. {dimples-1.4.1 → dimples-1.4.2}/dimples/station/handler.py +0 -0
  163. {dimples-1.4.1 → dimples-1.4.2}/dimples/station/shared.py +0 -0
  164. {dimples-1.4.1 → dimples-1.4.2}/dimples/station/start.py +0 -0
  165. {dimples-1.4.1 → dimples-1.4.2}/dimples/utils/__init__.py +0 -0
  166. {dimples-1.4.1 → dimples-1.4.2}/dimples/utils/cache.py +0 -0
  167. {dimples-1.4.1 → dimples-1.4.2}/dimples/utils/checker.py +0 -0
  168. {dimples-1.4.1 → dimples-1.4.2}/dimples.egg-info/SOURCES.txt +0 -0
  169. {dimples-1.4.1 → dimples-1.4.2}/dimples.egg-info/dependency_links.txt +0 -0
  170. {dimples-1.4.1 → dimples-1.4.2}/dimples.egg-info/entry_points.txt +0 -0
  171. {dimples-1.4.1 → dimples-1.4.2}/dimples.egg-info/requires.txt +0 -0
  172. {dimples-1.4.1 → dimples-1.4.2}/dimples.egg-info/top_level.txt +0 -0
  173. {dimples-1.4.1 → dimples-1.4.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dimples
3
- Version: 1.4.1
3
+ Version: 1.4.2
4
4
  Summary: DIMP Library for Edges and Stations
5
5
  Home-page: https://github.com/dimchat/demo-py
6
6
  Author: Albert Moky
@@ -470,7 +470,7 @@ __all__ = [
470
470
  # Table
471
471
  #
472
472
 
473
- 'DbTask',
473
+ 'DbTask', 'DataCache',
474
474
 
475
475
  'PrivateKeyTable', 'MetaTable', 'DocumentTable',
476
476
  'UserTable', 'GroupTable', 'GroupHistoryTable',
@@ -34,7 +34,7 @@ from ..common.dbi import *
34
34
  from .dos import *
35
35
  from .redis import *
36
36
 
37
- from .t_base import DbTask
37
+ from .t_base import DbTask, DataCache
38
38
 
39
39
  from .t_private import PrivateKeyTable
40
40
  from .t_meta import MetaTable
@@ -100,7 +100,7 @@ __all__ = [
100
100
  # Table
101
101
  #
102
102
 
103
- 'DbTask',
103
+ 'DbTask', 'DataCache',
104
104
 
105
105
  'PrivateKeyTable', 'MetaTable', 'DocumentTable',
106
106
  'UserTable', 'GroupTable', 'GroupHistoryTable',
@@ -61,37 +61,37 @@ class DbTask(Logging, Generic[K, V], ABC):
61
61
  def __init__(self, mutex_lock: threading.Lock, cache_pool: CachePool,
62
62
  cache_expires: float = None, cache_refresh: float = None):
63
63
  super().__init__()
64
- self.__lock = mutex_lock
64
+ self._lock = mutex_lock
65
65
  # memory cache
66
- self.__cache_pool = cache_pool
66
+ self._cache_pool = cache_pool
67
67
  # memory expires
68
68
  if cache_expires is None:
69
- self.__cache_expires = self.MEM_CACHE_EXPIRES
69
+ self._cache_expires = self.MEM_CACHE_EXPIRES
70
70
  else:
71
71
  assert cache_expires > 0, 'cache expires durations error: %s' % cache_expires
72
- self.__cache_expires = cache_expires
72
+ self._cache_expires = cache_expires
73
73
  # memory refresh
74
74
  if cache_refresh is None:
75
- self.__cache_refresh = self.MEM_CACHE_REFRESH
75
+ self._cache_refresh = self.MEM_CACHE_REFRESH
76
76
  else:
77
77
  assert cache_refresh > 0, 'cache refresh durations error: %s' % cache_refresh
78
- self.__cache_refresh = cache_refresh
78
+ self._cache_refresh = cache_refresh
79
79
 
80
80
  @property # protected
81
81
  def lock(self) -> threading.Lock:
82
- return self.__lock
82
+ return self._lock
83
83
 
84
84
  @property # protected
85
85
  def cache_pool(self) -> CachePool[K, V]:
86
- return self.__cache_pool
86
+ return self._cache_pool
87
87
 
88
88
  @property # protected
89
89
  def cache_expires(self) -> float:
90
- return self.__cache_expires
90
+ return self._cache_expires
91
91
 
92
92
  @property # protected
93
93
  def cache_refresh(self) -> float:
94
- return self.__cache_refresh
94
+ return self._cache_refresh
95
95
 
96
96
  @property # protected
97
97
  @abstractmethod
@@ -72,7 +72,7 @@ class MemberTask(GrpTask):
72
72
  # 4. return empty array as a placeholder for the memory cache
73
73
  members = []
74
74
  # 5. update redis server
75
- await self._dos.save_members(members=members, group=self._group)
75
+ await self._redis.save_members(members=members, group=self._group)
76
76
  return members
77
77
 
78
78
  # Override
@@ -99,7 +99,7 @@ class BotTask(GrpTask):
99
99
  # 4. return empty array as a placeholder for the memory cache
100
100
  bots = []
101
101
  # 5. update redis server
102
- await self._dos.save_assistants(assistants=bots, group=self._group)
102
+ await self._redis.save_assistants(assistants=bots, group=self._group)
103
103
  return bots
104
104
 
105
105
  # Override
@@ -126,7 +126,7 @@ class AdminTask(GrpTask):
126
126
  # 4. return empty array as a placeholder for the memory cache
127
127
  admins = []
128
128
  # 5. update redis server
129
- await self._dos.save_administrators(administrators=admins, group=self._group)
129
+ await self._redis.save_administrators(administrators=admins, group=self._group)
130
130
  return admins
131
131
 
132
132
  # Override
@@ -68,7 +68,7 @@ class HisTask(DbTask[ID, List[Tuple[GroupCommand, ReliableMessage]]]):
68
68
  # 4. return empty array as a placeholder for the memory cache
69
69
  array = []
70
70
  # 5. update redis server
71
- await self._dos.save_group_histories(group=self._group, histories=array)
71
+ await self._redis.save_group_histories(group=self._group, histories=array)
72
72
  return array
73
73
 
74
74
  # Override
@@ -67,7 +67,7 @@ class PwdTask(DbTask[Tuple[ID, ID], Dict[str, str]]):
67
67
  # 4. return empty dictionary as a placeholder for the memory cache
68
68
  keys = {}
69
69
  # 5. update redis server
70
- await self._dos.save_group_keys(group=self._group, sender=self._sender, keys=keys)
70
+ await self._redis.save_group_keys(group=self._group, sender=self._sender, keys=keys)
71
71
  return keys
72
72
 
73
73
  # Override
@@ -68,7 +68,7 @@ class TaiTask(DbTask[ID, Meta]):
68
68
  meta = await self._dos.get_meta(identifier=self._identifier)
69
69
  if meta is not None:
70
70
  # 3. update redis server
71
- await self._dos.save_meta(meta=meta, identifier=self._identifier)
71
+ await self._redis.save_meta(meta=meta, identifier=self._identifier)
72
72
  return meta
73
73
 
74
74
  # Override
@@ -24,7 +24,7 @@
24
24
  # ==============================================================================
25
25
 
26
26
  from configparser import ConfigParser
27
- from typing import Optional, Any, Dict, List
27
+ from typing import Optional, Any, List, Dict
28
28
  from typing import Iterable
29
29
 
30
30
  from aiou import JSONFile
@@ -33,6 +33,7 @@ from aiou import RedisConnector
33
33
  from dimsdk import JSON
34
34
  from dimsdk import Dictionary
35
35
  from dimsdk import ID
36
+ from dimsdk import Facebook
36
37
 
37
38
  from .log import Log, Logging
38
39
  from .http import HttpClient
@@ -104,7 +105,8 @@ class Config(Logging):
104
105
  def __init__(self):
105
106
  super().__init__()
106
107
  self.__parser: Optional[ConfigParser] = None
107
- self.__info: Optional[Dict] = None
108
+ self.__ready = False
109
+ self.__info = {}
108
110
  self.__path: Optional[str] = None
109
111
  self.__redis: Optional[RedisConnector] = None
110
112
  self.__stations: List[MessageTransferAgent] = []
@@ -120,7 +122,7 @@ class Config(Logging):
120
122
  parser = ConfigParser()
121
123
  parser.read(path)
122
124
  self.__parser = parser
123
- self.__info = None
125
+ self.__ready = False
124
126
  self.__stations = None
125
127
  # load neighbor stations
126
128
  try:
@@ -132,13 +134,12 @@ class Config(Logging):
132
134
 
133
135
  @property
134
136
  def dictionary(self) -> Optional[Dict]:
135
- info = self.__info
136
- if info is None:
137
- parser = self.__parser
138
- if parser is not None:
139
- info = _config_sections(parser=parser)
140
- self.__info = info
141
- return info
137
+ parser = self.__parser
138
+ if parser is None or self.__ready:
139
+ return self.__info
140
+ else:
141
+ self.__ready = True
142
+ return _update_sections(info=self.__info, parser=parser)
142
143
 
143
144
  # Override
144
145
  def __str__(self) -> str:
@@ -198,6 +199,37 @@ class Config(Logging):
198
199
  result.append(string)
199
200
  return result
200
201
 
202
+ #
203
+ # ID list
204
+ #
205
+
206
+ def get_identifiers(self, section: str, option: str) -> List[ID]:
207
+ array = self.get_list(section=section, option=option)
208
+ return ID.convert(array=array)
209
+
210
+ async def get_users(self, section: str, option: str, facebook: Facebook) -> List[ID]:
211
+ users = []
212
+ array = self.get_identifiers(section=section, option=option)
213
+ for item in array:
214
+ if item.is_user:
215
+ if item not in users:
216
+ users.append(item)
217
+ continue
218
+ # extract group members
219
+ members = await facebook.get_members(identifier=item)
220
+ for usr in members:
221
+ if usr not in users:
222
+ users.append(usr)
223
+ return users
224
+
225
+ async def get_supervisors(self, section: str = 'admin', option: str = 'supervisors',
226
+ facebook: Facebook = None) -> List[ID]:
227
+ """ extract group members when facebook available """
228
+ if facebook is None:
229
+ return self.get_identifiers(section=section, option=option)
230
+ else:
231
+ return await self.get_users(section=section, option=option, facebook=facebook)
232
+
201
233
  #
202
234
  # database
203
235
  #
@@ -335,10 +367,12 @@ class NeighborLoader(Logging):
335
367
  self.info(msg='downloading stations: %s' % url)
336
368
  http = self.__http
337
369
  try:
338
- text = http.cache_get(url=url)
339
- if text is None:
370
+ response = http.cache_get(url=url)
371
+ if response is None or response.status_code != 200:
372
+ self.error(msg='failed to get URL: %s response: %s' % (url, response))
340
373
  return None
341
374
  else:
375
+ text = response.text
342
376
  stations = JSON.decode(string=text)
343
377
  except Exception as error:
344
378
  self.error(msg='failed to download stations: %s, %s' % (error, url))
@@ -369,8 +403,7 @@ class NeighborLoader(Logging):
369
403
  self.error(msg='failed to save stations: %s, %s' % (error, path))
370
404
 
371
405
 
372
- def _config_sections(parser: ConfigParser) -> Dict:
373
- info = {}
406
+ def _update_sections(info: Dict, parser: ConfigParser) -> Dict:
374
407
  sections = parser.sections()
375
408
  for name in sections:
376
409
  options = _section_options(parser=parser, section=name)
@@ -158,7 +158,7 @@ class HttpClient(Logging):
158
158
  def remove_cache(self, url: str):
159
159
  self.__web_cache.erase(key=url)
160
160
 
161
- def cache_get(self, url: str, headers: Dict = None):
161
+ def cache_get(self, url: str, headers: Dict = None) -> Optional[Response]:
162
162
  now = DateTime.now()
163
163
  # 1. check memory cache
164
164
  value, holder = self.__web_cache.fetch(key=url, now=now)
@@ -174,11 +174,9 @@ class HttpClient(Logging):
174
174
  # cache expired, wait to reload
175
175
  holder.renewal(duration=self.CACHE_REFRESHING, now=now)
176
176
  # 2. query remote server
177
- response = self.http_get(url=url, headers=headers)
178
- if response.status_code == 200:
179
- value = response.text
180
- # 3. update memory cache
181
- self.__web_cache.update(key=url, value=value, life_span=self.CACHE_EXPIRES, now=now)
177
+ value = self.http_get(url=url, headers=headers)
178
+ # 3. update memory cache
179
+ self.__web_cache.update(key=url, value=value, life_span=self.CACHE_EXPIRES, now=now)
182
180
  # OK, return cached value
183
181
  return value
184
182
 
@@ -35,6 +35,16 @@ def current_time() -> str:
35
35
  return str(DateTime.now())
36
36
 
37
37
 
38
+ def shorten(text: str, max_len: int = 1024) -> str:
39
+ # assert max_len > 128, 'too short: %s' % max_len
40
+ size = 0 if text is None else len(text)
41
+ if size <= max_len:
42
+ return text
43
+ desc = 'total %d chars' % size
44
+ pos = (max_len - len(desc) - 10) >> 1
45
+ return '%s ... %s ... %s' % (text[:pos], desc, text[-pos:])
46
+
47
+
38
48
  DEBUG_FLAG = 0x01
39
49
  INFO_FLAG = 0x02
40
50
  WARNING_FLAG = 0x04
@@ -49,28 +59,38 @@ class Log:
49
59
 
50
60
  LEVEL = RELEASE
51
61
 
62
+ MAX_LEN = 1024
63
+
52
64
  @classmethod
53
65
  def debug(cls, msg: str):
54
66
  if cls.LEVEL & DEBUG_FLAG == 0:
55
67
  return None
68
+ # elif cls.MAX_LEN > 0:
69
+ # msg = shorten(text=msg, max_len=cls.MAX_LEN)
56
70
  print('[%s] DEBUG | %s' % (current_time(), msg))
57
71
 
58
72
  @classmethod
59
73
  def info(cls, msg: str):
60
74
  if cls.LEVEL & INFO_FLAG == 0:
61
75
  return None
76
+ elif cls.MAX_LEN > 0:
77
+ msg = shorten(text=msg, max_len=cls.MAX_LEN)
62
78
  print('[%s] | %s' % (current_time(), msg))
63
79
 
64
80
  @classmethod
65
81
  def warning(cls, msg: str):
66
82
  if cls.LEVEL & WARNING_FLAG == 0:
67
83
  return None
84
+ elif cls.MAX_LEN > 0:
85
+ msg = shorten(text=msg, max_len=cls.MAX_LEN)
68
86
  print('[%s] WARNING | %s' % (current_time(), msg))
69
87
 
70
88
  @classmethod
71
89
  def error(cls, msg: str):
72
90
  if cls.LEVEL & ERROR_FLAG == 0:
73
91
  return None
92
+ elif cls.MAX_LEN > 0:
93
+ msg = shorten(text=msg, max_len=cls.MAX_LEN)
74
94
  print('[%s] ERROR | %s' % (current_time(), msg))
75
95
 
76
96
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dimples
3
- Version: 1.4.1
3
+ Version: 1.4.2
4
4
  Summary: DIMP Library for Edges and Stations
5
5
  Home-page: https://github.com/dimchat/demo-py
6
6
  Author: Albert Moky
@@ -14,7 +14,7 @@ import io
14
14
 
15
15
  from setuptools import setup, find_packages
16
16
 
17
- __version__ = '1.4.1'
17
+ __version__ = '1.4.2'
18
18
  __author__ = 'Albert Moky'
19
19
  __contact__ = 'albert.moky@gmail.com'
20
20
 
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