re-common 10.0.12__tar.gz → 10.0.14__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 (227) hide show
  1. {re_common-10.0.12 → re_common-10.0.14}/PKG-INFO +1 -1
  2. re_common-10.0.14/re_common/v2/baselibrary/decorators/utils.py +59 -0
  3. re_common-10.0.14/re_common/v2/baselibrary/tools/ac_ahocorasick.py +76 -0
  4. {re_common-10.0.12 → re_common-10.0.14}/re_common/v2/baselibrary/tools/search_hash_tools.py +4 -3
  5. {re_common-10.0.12 → re_common-10.0.14}/re_common/v2/baselibrary/tools/text_matcher.py +131 -28
  6. {re_common-10.0.12 → re_common-10.0.14}/re_common/v2/baselibrary/utils/BusinessStringUtil.py +21 -7
  7. re_common-10.0.14/re_common/v2/baselibrary/utils/basepika.py +180 -0
  8. re_common-10.0.14/re_common/v2/baselibrary/utils/mq.py +83 -0
  9. {re_common-10.0.12 → re_common-10.0.14}/re_common/v2/baselibrary/utils/string_bool.py +12 -0
  10. {re_common-10.0.12 → re_common-10.0.14}/re_common/v2/baselibrary/utils/string_clear.py +9 -0
  11. {re_common-10.0.12 → re_common-10.0.14}/re_common/v2/baselibrary/utils/stringutils.py +2 -1
  12. re_common-10.0.14/re_common/vip/proxy/__init__.py +0 -0
  13. {re_common-10.0.12 → re_common-10.0.14}/re_common.egg-info/PKG-INFO +1 -1
  14. {re_common-10.0.12 → re_common-10.0.14}/re_common.egg-info/SOURCES.txt +5 -0
  15. {re_common-10.0.12 → re_common-10.0.14}/setup.py +1 -1
  16. {re_common-10.0.12 → re_common-10.0.14}/LICENSE +0 -0
  17. {re_common-10.0.12 → re_common-10.0.14}/README.md +0 -0
  18. {re_common-10.0.12 → re_common-10.0.14}/re_common/__init__.py +0 -0
  19. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/__init__.py +0 -0
  20. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/baseabs/__init__.py +0 -0
  21. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/baseabs/baseabs.py +0 -0
  22. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/database/__init__.py +0 -0
  23. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/database/mbuilder.py +0 -0
  24. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/database/moudle.py +0 -0
  25. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/database/msqlite3.py +0 -0
  26. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/database/mysql.py +0 -0
  27. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/database/sql_factory.py +0 -0
  28. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/mthread/MThreadingRun.py +0 -0
  29. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/mthread/MThreadingRunEvent.py +0 -0
  30. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/mthread/__init__.py +0 -0
  31. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/mthread/mythreading.py +0 -0
  32. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/pakge_other/__init__.py +0 -0
  33. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/pakge_other/socks.py +0 -0
  34. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/readconfig/__init__.py +0 -0
  35. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/readconfig/config_factory.py +0 -0
  36. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/readconfig/ini_config.py +0 -0
  37. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/readconfig/toml_config.py +0 -0
  38. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/temporary/__init__.py +0 -0
  39. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/temporary/envdata.py +0 -0
  40. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/__init__.py +0 -0
  41. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/all_requests/__init__.py +0 -0
  42. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/all_requests/aiohttp_request.py +0 -0
  43. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/all_requests/httpx_requet.py +0 -0
  44. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/all_requests/mrequest.py +0 -0
  45. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/all_requests/requests_request.py +0 -0
  46. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/batch_compre/__init__.py +0 -0
  47. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/batch_compre/bijiao_batch.py +0 -0
  48. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/contrast_db3.py +0 -0
  49. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/copy_file.py +0 -0
  50. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/db3_2_sizedb3.py +0 -0
  51. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/foreachgz.py +0 -0
  52. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/get_attr.py +0 -0
  53. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/image_to_pdf.py +0 -0
  54. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/java_code_deal.py +0 -0
  55. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/javacode.py +0 -0
  56. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/mdb_db3.py +0 -0
  57. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/merge_file.py +0 -0
  58. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/merge_gz_file.py +0 -0
  59. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/mhdfstools/__init__.py +0 -0
  60. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/mhdfstools/down_hdfs_files.py +0 -0
  61. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/mhdfstools/hdfst.py +0 -0
  62. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/mhdfstools/up_hdfs_files.py +0 -0
  63. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/mongo_tools.py +0 -0
  64. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/move_file.py +0 -0
  65. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/move_mongo/__init__.py +0 -0
  66. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/move_mongo/mongo_table_to_file.py +0 -0
  67. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/move_mongo/move_mongo_table.py +0 -0
  68. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/move_mongo/use_mttf.py +0 -0
  69. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/move_mongo/use_mv.py +0 -0
  70. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/mpandas/__init__.py +0 -0
  71. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/mpandas/mpandasreadexcel.py +0 -0
  72. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/mpandas/pandas_visualization.py +0 -0
  73. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/myparsel.py +0 -0
  74. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/rename_dir_file.py +0 -0
  75. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/sequoiadb_utils.py +0 -0
  76. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/split_line_to_many.py +0 -0
  77. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/stringtodicts.py +0 -0
  78. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/tools/workwechant_bot.py +0 -0
  79. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/__init__.py +0 -0
  80. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/baseaiohttp.py +0 -0
  81. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/baseaiomysql.py +0 -0
  82. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/baseallstep.py +0 -0
  83. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/baseavro.py +0 -0
  84. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/baseboto3.py +0 -0
  85. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basecsv.py +0 -0
  86. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basedict.py +0 -0
  87. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basedir.py +0 -0
  88. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/baseencode.py +0 -0
  89. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/baseencoding.py +0 -0
  90. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/baseesdsl.py +0 -0
  91. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/baseexcel.py +0 -0
  92. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/baseexcept.py +0 -0
  93. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basefile.py +0 -0
  94. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/baseftp.py +0 -0
  95. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basegzip.py +0 -0
  96. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basehdfs.py +0 -0
  97. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basehttpx.py +0 -0
  98. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/baseip.py +0 -0
  99. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basejson.py +0 -0
  100. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/baselist.py +0 -0
  101. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basemotor.py +0 -0
  102. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basemssql.py +0 -0
  103. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/baseodbc.py +0 -0
  104. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basepandas.py +0 -0
  105. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basepeewee.py +0 -0
  106. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basepika.py +0 -0
  107. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basepydash.py +0 -0
  108. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basepymongo.py +0 -0
  109. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basequeue.py +0 -0
  110. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/baserar.py +0 -0
  111. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/baserequest.py +0 -0
  112. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/baseset.py +0 -0
  113. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basesmb.py +0 -0
  114. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basestring.py +0 -0
  115. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basetime.py +0 -0
  116. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basetuple.py +0 -0
  117. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/baseurl.py +0 -0
  118. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/basezip.py +0 -0
  119. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/core/__init__.py +0 -0
  120. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/core/bottomutils.py +0 -0
  121. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/core/mdeprecated.py +0 -0
  122. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/core/mlamada.py +0 -0
  123. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/core/msginfo.py +0 -0
  124. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/core/requests_core.py +0 -0
  125. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/fateadm.py +0 -0
  126. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/importfun.py +0 -0
  127. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/mfaker.py +0 -0
  128. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/my_abc/__init__.py +0 -0
  129. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/my_abc/better_abc.py +0 -0
  130. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/mylogger.py +0 -0
  131. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/myredisclient.py +0 -0
  132. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/pipupgrade.py +0 -0
  133. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/ringlist.py +0 -0
  134. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/version_compare.py +0 -0
  135. {re_common-10.0.12 → re_common-10.0.14}/re_common/baselibrary/utils/ydmhttp.py +0 -0
  136. {re_common-10.0.12 → re_common-10.0.14}/re_common/facade/__init__.py +0 -0
  137. {re_common-10.0.12 → re_common-10.0.14}/re_common/facade/lazy_import.py +0 -0
  138. {re_common-10.0.12 → re_common-10.0.14}/re_common/facade/loggerfacade.py +0 -0
  139. {re_common-10.0.12 → re_common-10.0.14}/re_common/facade/mysqlfacade.py +0 -0
  140. {re_common-10.0.12 → re_common-10.0.14}/re_common/facade/now.py +0 -0
  141. {re_common-10.0.12 → re_common-10.0.14}/re_common/facade/sqlite3facade.py +0 -0
  142. {re_common-10.0.12 → re_common-10.0.14}/re_common/facade/use/__init__.py +0 -0
  143. {re_common-10.0.12 → re_common-10.0.14}/re_common/facade/use/mq_use_facade.py +0 -0
  144. {re_common-10.0.12 → re_common-10.0.14}/re_common/facade/use/proxy_use_facade.py +0 -0
  145. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/__init__.py +0 -0
  146. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/base_dict_test.py +0 -0
  147. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/baseavro_test.py +0 -0
  148. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/basefile_test.py +0 -0
  149. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/basemssql_test.py +0 -0
  150. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/baseodbc_test.py +0 -0
  151. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/basepandas_test.py +0 -0
  152. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/get_attr_test/__init__.py +0 -0
  153. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/get_attr_test/get_attr_test_settings.py +0 -0
  154. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/get_attr_test/settings.py +0 -0
  155. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/idencode_test.py +0 -0
  156. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/iniconfig_test.py +0 -0
  157. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/ip_test.py +0 -0
  158. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/merge_file_test.py +0 -0
  159. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/mfaker_test.py +0 -0
  160. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/mm3_test.py +0 -0
  161. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/mylogger_test.py +0 -0
  162. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/myparsel_test.py +0 -0
  163. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/mysql_test.py +0 -0
  164. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/pymongo_test.py +0 -0
  165. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/split_test.py +0 -0
  166. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/sqlite3_merge_test.py +0 -0
  167. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/sqlite3_test.py +0 -0
  168. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/tomlconfig_test.py +0 -0
  169. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/use_tools_test/__init__.py +0 -0
  170. {re_common-10.0.12 → re_common-10.0.14}/re_common/libtest/user/__init__.py +0 -0
  171. {re_common-10.0.12 → re_common-10.0.14}/re_common/studio/__init__.py +0 -0
  172. {re_common-10.0.12 → re_common-10.0.14}/re_common/studio/assignment_expressions.py +0 -0
  173. {re_common-10.0.12 → re_common-10.0.14}/re_common/studio/mydash/__init__.py +0 -0
  174. {re_common-10.0.12 → re_common-10.0.14}/re_common/studio/mydash/test1.py +0 -0
  175. {re_common-10.0.12 → re_common-10.0.14}/re_common/studio/pydashstudio/__init__.py +0 -0
  176. {re_common-10.0.12 → re_common-10.0.14}/re_common/studio/pydashstudio/first.py +0 -0
  177. {re_common-10.0.12 → re_common-10.0.14}/re_common/studio/streamlitstudio/__init__.py +0 -0
  178. {re_common-10.0.12 → re_common-10.0.14}/re_common/studio/streamlitstudio/first_app.py +0 -0
  179. {re_common-10.0.12 → re_common-10.0.14}/re_common/studio/streamlitstudio/uber_pickups.py +0 -0
  180. {re_common-10.0.12 → re_common-10.0.14}/re_common/studio/test.py +0 -0
  181. {re_common-10.0.12 → re_common-10.0.14}/re_common/v2/__init__.py +0 -0
  182. {re_common-10.0.12 → re_common-10.0.14}/re_common/v2/baselibrary/__init__.py +0 -0
  183. {re_common-10.0.12/re_common/v2/baselibrary/helpers → re_common-10.0.14/re_common/v2/baselibrary/decorators}/__init__.py +0 -0
  184. {re_common-10.0.12/re_common/v2/baselibrary/s3object → re_common-10.0.14/re_common/v2/baselibrary/helpers}/__init__.py +0 -0
  185. {re_common-10.0.12/re_common/v2/baselibrary/tools → re_common-10.0.14/re_common/v2/baselibrary/s3object}/__init__.py +0 -0
  186. {re_common-10.0.12 → re_common-10.0.14}/re_common/v2/baselibrary/s3object/baseboto3.py +0 -0
  187. {re_common-10.0.12 → re_common-10.0.14}/re_common/v2/baselibrary/tools/WeChatRobot.py +0 -0
  188. {re_common-10.0.12/re_common/v2/baselibrary/utils → re_common-10.0.14/re_common/v2/baselibrary/tools}/__init__.py +0 -0
  189. {re_common-10.0.12 → re_common-10.0.14}/re_common/v2/baselibrary/tools/dict_tools.py +0 -0
  190. {re_common-10.0.12 → re_common-10.0.14}/re_common/v2/baselibrary/tools/dolphinscheduler.py +0 -0
  191. {re_common-10.0.12 → re_common-10.0.14}/re_common/v2/baselibrary/tools/list_tools.py +0 -0
  192. {re_common-10.0.12 → re_common-10.0.14}/re_common/v2/baselibrary/tools/unionfind_tools.py +0 -0
  193. {re_common-10.0.12/re_common/vip → re_common-10.0.14/re_common/v2/baselibrary/utils}/__init__.py +0 -0
  194. {re_common-10.0.12 → re_common-10.0.14}/re_common/v2/baselibrary/utils/author_smi.py +0 -0
  195. {re_common-10.0.12 → re_common-10.0.14}/re_common/v2/baselibrary/utils/basedict.py +0 -0
  196. {re_common-10.0.12 → re_common-10.0.14}/re_common/v2/baselibrary/utils/basehdfs.py +0 -0
  197. {re_common-10.0.12 → re_common-10.0.14}/re_common/v2/baselibrary/utils/json_cls.py +0 -0
  198. {re_common-10.0.12 → re_common-10.0.14}/re_common/v2/baselibrary/utils/n_ary_expression_tree.py +0 -0
  199. {re_common-10.0.12 → re_common-10.0.14}/re_common/v2/baselibrary/utils/string_smi.py +0 -0
  200. {re_common-10.0.12/re_common/vip/proxy → re_common-10.0.14/re_common/vip}/__init__.py +0 -0
  201. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/base_step_process.py +0 -0
  202. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/baseencodeid.py +0 -0
  203. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/changetaskname.py +0 -0
  204. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/core_var.py +0 -0
  205. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/mmh3Hash.py +0 -0
  206. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/proxy/allproxys.py +0 -0
  207. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/proxy/allproxys_thread.py +0 -0
  208. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/proxy/cnki_proxy.py +0 -0
  209. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/proxy/kuaidaili.py +0 -0
  210. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/proxy/proxy_all.py +0 -0
  211. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/proxy/update_kuaidaili_0.py +0 -0
  212. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/proxy/wanfang_proxy.py +0 -0
  213. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/proxy/wp_proxy_all.py +0 -0
  214. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/read_rawid_to_txt.py +0 -0
  215. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/title/__init__.py +0 -0
  216. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/title/transform/TransformBookTitleToZt.py +0 -0
  217. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/title/transform/TransformConferenceTitleToZt.py +0 -0
  218. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/title/transform/TransformCstadTitleToZt.py +0 -0
  219. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/title/transform/TransformJournalTitleToZt.py +0 -0
  220. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/title/transform/TransformPatentTitleToZt.py +0 -0
  221. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/title/transform/TransformRegulationTitleToZt.py +0 -0
  222. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/title/transform/TransformStandardTitleToZt.py +0 -0
  223. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/title/transform/TransformThesisTitleToZt.py +0 -0
  224. {re_common-10.0.12 → re_common-10.0.14}/re_common/vip/title/transform/__init__.py +0 -0
  225. {re_common-10.0.12 → re_common-10.0.14}/re_common.egg-info/dependency_links.txt +0 -0
  226. {re_common-10.0.12 → re_common-10.0.14}/re_common.egg-info/top_level.txt +0 -0
  227. {re_common-10.0.12 → re_common-10.0.14}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: re_common
3
- Version: 10.0.12
3
+ Version: 10.0.14
4
4
  Summary: a library about all python projects
5
5
  Home-page: https://gitee.com/xujiangios/re-common
6
6
  Author: vic
@@ -0,0 +1,59 @@
1
+ import warnings
2
+ import functools
3
+
4
+ # 全局集合,用于记录已警告的函数或类
5
+ _warned_once = set()
6
+
7
+
8
+ def deprecated(message=None):
9
+ """
10
+ 装饰器:标记函数或类为已废弃,整个进程只发出一次警告。
11
+
12
+ Args:
13
+ message (str): 自定义警告信息,默认为 None。
14
+ """
15
+
16
+ def decorator(obj):
17
+ # 如果是函数
18
+ if isinstance(obj, type(lambda: None)):
19
+ @functools.wraps(obj)
20
+ def wrapper(*args, **kwargs):
21
+ obj_id = id(obj) # 使用对象的内存地址作为唯一标识
22
+ if obj_id not in _warned_once:
23
+ default_msg = f"函数 {obj.__name__} 已不建议使用。"
24
+ warn_msg = f"{default_msg} {message}" if message else default_msg
25
+ warnings.warn(
26
+ warn_msg,
27
+ category=DeprecationWarning,
28
+ stacklevel=2
29
+ )
30
+ _warned_once.add(obj_id) # 记录已警告
31
+ return obj(*args, **kwargs)
32
+
33
+ return wrapper
34
+
35
+ # 如果是类
36
+ elif isinstance(obj, type):
37
+ orig_init = obj.__init__
38
+
39
+ @functools.wraps(orig_init)
40
+ def new_init(self, *args, **kwargs):
41
+ obj_id = id(obj)
42
+ if obj_id not in _warned_once:
43
+ default_msg = f"类 {obj.__name__} 已不建议使用。"
44
+ warn_msg = f"{default_msg} {message}" if message else default_msg
45
+ warnings.warn(
46
+ warn_msg,
47
+ category=DeprecationWarning,
48
+ stacklevel=2
49
+ )
50
+ _warned_once.add(obj_id) # 记录已警告
51
+ orig_init(self, *args, **kwargs)
52
+
53
+ obj.__init__ = new_init
54
+ return obj
55
+
56
+ else:
57
+ raise TypeError("此装饰器仅适用于函数和类")
58
+
59
+ return decorator
@@ -0,0 +1,76 @@
1
+ import pickle
2
+
3
+ import ahocorasick
4
+
5
+
6
+ class ACTool(object):
7
+
8
+ def __init__(self):
9
+ self.automaton = ahocorasick.Automaton()
10
+
11
+ def add_word(self, key, value, overwrite=True) -> bool:
12
+ """
13
+ 为 AC 机添加数据,默认情况下 key重复直接覆盖
14
+ :param key: 要添加的关键字
15
+ :param value: 对应的值
16
+ :param overwrite: 是否覆盖已有的 key,默认为 True
17
+ :return: 是否成功添加或覆盖
18
+ """
19
+ if key in self.automaton: # 检查 key 是否已存在
20
+ if overwrite: # 如果允许覆盖
21
+ self.automaton.add_word(key, value)
22
+ return True
23
+ else: # 不允许覆盖,跳过
24
+ return False
25
+ else: # key 不存在,直接添加
26
+ self.automaton.add_word(key, value)
27
+ return True
28
+
29
+ def is_exists_key(self, key) -> bool:
30
+ # 是否存在key
31
+ if self.automaton.exists(key):
32
+ return True
33
+ else:
34
+ return False
35
+
36
+ def make_automaton(self):
37
+ """
38
+ 添加完词后需要构建
39
+ """
40
+ self.automaton.make_automaton()
41
+
42
+ def iter(self, key):
43
+ """
44
+ 结果为可迭代对象 可通过list 转换 [(end_index, value)]
45
+ tool.add_word("he", "word1")
46
+ tool.add_word("hello", "word2")
47
+
48
+ # 在字符串中查找匹配
49
+ input_string = "hello world"
50
+ matches = list(tool.automaton.iter(input_string))
51
+ print(matches) # [(1, 'word1'), (4, 'word2')]
52
+
53
+ (1, 'word1'):
54
+ end_index = 1: 表示匹配的关键字 "he" 在 input_string = "hello world" 中的结束位置是索引 1(即字符串 "he" 的最后一个字符 'e' 的位置)。
55
+ "hello world" 的索引:h(0)e(1)l(2)l(3)o(4) (5)w(6)o(7)r(8)l(9)d(10)。
56
+ value = 'word1': 表示匹配的关键字 "he" 对应的值是 "word1"。
57
+ (4, 'word2'):
58
+ end_index = 4: 表示匹配的关键字 "hello" 在 input_string = "hello world" 中的结束位置是索引 4(即字符串 "hello" 的最后一个字符 'o' 的位置)。
59
+ value = 'word2': 表示匹配的关键字 "hello" 对应的值是 "word2"。
60
+
61
+ 注意: 结果只会返回 value 不会返回 key,如果需要key 请将key 组合到结果中
62
+ """
63
+
64
+ result_iter = self.automaton.iter(key) # ahocorasick.AutomatonSearchIter
65
+ return result_iter
66
+ def save(self,local_temp_path):
67
+ """
68
+ 将构建好的ac自动机保存到本地
69
+ """
70
+ self.automaton.save(local_temp_path,pickle.dumps)
71
+
72
+ def load(self,local_temp_path):
73
+ """
74
+ 加载已经构建好的ac自动机
75
+ """
76
+ self.automaton=ahocorasick.load(local_temp_path, pickle.loads)
@@ -3,9 +3,10 @@ from typing import List
3
3
  import jieba
4
4
  from datasketch import MinHash, minhash
5
5
 
6
+ from re_common.v2.baselibrary.decorators.utils import deprecated
6
7
  from re_common.v2.baselibrary.utils.string_bool import is_single_cjk_char
7
8
 
8
-
9
+ @deprecated("请使用 TextMatcherV2 中的方法代替。")
9
10
  def tokenize(text: str, stopwords=None) -> List[str]:
10
11
  """
11
12
  分词并移除停用词
@@ -32,7 +33,7 @@ def tokenize(text: str, stopwords=None) -> List[str]:
32
33
  words = [w for w in words if w not in stopwords and w.strip()]
33
34
  return words
34
35
 
35
-
36
+ @deprecated("请使用 TextMatcherV2 中的方法代替。")
36
37
  def create_minhash(words: List[str], num_perm=128) -> MinHash:
37
38
  """
38
39
  为分词结果创建 MinHash
@@ -42,7 +43,7 @@ def create_minhash(words: List[str], num_perm=128) -> MinHash:
42
43
  minhash.update(word.encode("utf-8"))
43
44
  return minhash
44
45
 
45
-
46
+ @deprecated("请使用 TextMatcherV2 中的方法代替。")
46
47
  def get_str_minhash(title):
47
48
  from re_common.v2.baselibrary.utils.string_clear import rel_clear
48
49
  rel_title = rel_clear(title)
@@ -1,10 +1,16 @@
1
+ import pickle
2
+
1
3
  import jieba
2
4
  import re
3
- from typing import List, Dict, Tuple, Set, Optional, Union
5
+ from typing import List, Dict, Tuple, Set, Optional, Union, Hashable, Protocol
4
6
  from datasketch import MinHash, MinHashLSH
5
7
 
8
+ from re_common.v2.baselibrary.decorators.utils import deprecated
9
+ from re_common.v2.baselibrary.utils.string_bool import is_single_cjk_char
10
+
6
11
 
7
- class TextMatcher:
12
+ @deprecated("请使用 TextMatcherV2 代替。")
13
+ class TextMatcher(object):
8
14
  def __init__(
9
15
  self,
10
16
  threshold: float = 0.5,
@@ -188,36 +194,133 @@ class TextMatcher:
188
194
  self.doc_counter = 0
189
195
 
190
196
 
191
- if __name__ == "__main__":
192
- # 创建匹配器实例
193
- matcher = TextMatcher(
194
- threshold=0.1, # 相似度阈值
195
- num_perm=128, # MinHash 排列数
196
- )
197
+ # 定义一个协议,描述“像鸭子一样”的行为
198
+ class TokenizeDuckLike(Protocol):
199
+ def get_words(self, text) -> List:
200
+ pass
201
+
202
+
203
+ class JiebaTokenize(object):
204
+
205
+ def __init__(self, stopwords=None):
206
+ self.stopwords = stopwords
207
+
208
+ def get_words(self, text) -> List:
209
+
210
+ if self.stopwords is None:
211
+ stopwords = []
212
+ words = jieba.lcut(text)
213
+
214
+ # 统计单字符数据 长度,防止结巴分词分不了的单词 将数据分为单个字符
215
+
216
+ # 这里为什么使用函数 而不是在推导式中兼容,主要是在一些 spark中 推导式的if 条件不遵循最短路径原则会将表达式当做一个整体算子
217
+ def is_singel_en(i):
218
+ if len(i) == 1 and not is_single_cjk_char(i):
219
+ return True
220
+ return False
221
+
222
+ one_char_size = len([i for i in words if is_singel_en(i)])
223
+ all_size = len(words)
224
+ # 如果单字符个数超过一定比例 就直接用空格分词
225
+ if all_size != 0 and one_char_size / all_size > 0.6:
226
+ words = [i for i in text.split() if i.strip()]
227
+
228
+ # 过滤停用词和空字符
229
+ words = [w for w in words if w not in stopwords and w.strip()]
230
+ return words
231
+
232
+
233
+ class TextMatcherV2:
234
+
235
+ def __init__(
236
+ self,
237
+ threshold: float = 0.5,
238
+ num_perm: int = 128,
239
+ tdk: TokenizeDuckLike = None
240
+ ):
241
+ """
242
+ 初始化文本匹配器
243
+
244
+ Args:
245
+ threshold: LSH 相似度阈值
246
+ num_perm: MinHash 排列数
247
+ stopwords_path: 停用词文件路径
248
+ user_dict_path: 用户自定义词典路径
249
+ """
250
+ self.threshold = threshold
251
+ self.num_perm = num_perm
252
+ self.lsh = MinHashLSH(threshold=threshold, num_perm=num_perm)
253
+ self.tdk = tdk
254
+
255
+ def add_document(self, doc_id: str, minhash: Union[MinHash, str], tdk: TokenizeDuckLike = None):
256
+ if isinstance(minhash, str):
257
+ minhash = self.str_to_minihash(minhash, tdk)
197
258
 
198
- # 添加单个文档
199
- doc_id = matcher.add_document(
200
- "北京是中国的首都"
201
- )
259
+ self.lsh.insert(doc_id, minhash)
202
260
 
203
- # 批量添加文档
204
- docs = {"doc1": "北京是一座现代化的大都市", "doc2": "上海是中国最大的城市", "doc3": "中国的首都是北京"}
205
- matcher.batch_add_documents(docs)
261
+ def batch_add_documents(self, betch_data: Union[list, dict], tdk: TokenizeDuckLike = None):
262
+ def _add_document(minhash_or_str, tdk):
263
+ if isinstance(minhash_or_str, str):
264
+ minhash_or_str = self.str_to_minihash(minhash_or_str, tdk)
265
+ self.add_document(docid, minhash_or_str, tdk)
266
+
267
+ if isinstance(betch_data, list):
268
+ # 必须是可解包的2个数据的元组或list
269
+ for docid, minhash_or_str in betch_data:
270
+ _add_document(minhash_or_str, tdk)
271
+ elif isinstance(betch_data, dict):
272
+ for docid, minhash_or_str in betch_data.items():
273
+ _add_document(minhash_or_str, tdk)
274
+ else:
275
+ raise Exception("数据类型错误")
276
+
277
+ def find_similar(self, query_minhash: Union[MinHash, str], tdk: TokenizeDuckLike = None) -> List[Hashable]:
278
+ # 使用 LSH 查找候选集
279
+ if isinstance(query_minhash, str):
280
+ query_minhash = self.str_to_minihash(query_minhash, tdk)
281
+ similar_docs = self.lsh.query(query_minhash)
282
+ return similar_docs
206
283
 
207
- # 查找相似文档(不返回相似度分数)
208
- similar_docs = matcher.find_similar("北京首都")
209
- print("相似文档ID:", similar_docs)
284
+ def create_minhash(self, words: List[str], num_perm=None) -> MinHash:
285
+ """
286
+ 为分词结果创建 MinHash
287
+ """
288
+ if num_perm is None:
289
+ num_perm = self.num_perm
290
+ minhash = MinHash(num_perm=num_perm)
291
+ for word in words:
292
+ minhash.update(word.encode("utf-8"))
293
+ return minhash
210
294
 
211
- # 查找相似文档(返回相似度分数)
212
- similar_docs_with_scores = matcher.find_similar("北京首都", return_similarities=True)
213
- print("相似文档ID和分数:", similar_docs_with_scores)
295
+ def create_words(self, text: str, tdk: TokenizeDuckLike = None):
296
+ if tdk is None:
297
+ tdk = self.tdk
298
+ worlds = tdk.get_words(text)
299
+ return worlds
300
+
301
+ def str_to_minihash(self, text: str, tdk: TokenizeDuckLike = None):
302
+ if tdk is None:
303
+ tdk = self.tdk
304
+ words = self.create_words(text, tdk)
305
+ minhash = self.create_minhash(words, self.num_perm)
306
+ return minhash
214
307
 
215
- # 获取原始文本
216
- for doc_id, score in similar_docs_with_scores:
217
- print(f"文档 {doc_id}: {matcher.get_text(doc_id)} (相似度: {score:.2f})")
308
+ def minhash_dumps(self, minhash) -> bytes:
309
+ """
310
+ 序列化
311
+ """
312
+ serialized_minhash = pickle.dumps(minhash)
313
+ return serialized_minhash
218
314
 
219
- # 删除文档
220
- matcher.remove_document("doc1")
315
+ def minhash_loads(self, serialized_minhash) -> MinHash:
316
+ """
317
+ 反序列化
318
+ """
319
+ minhash = pickle.loads(serialized_minhash)
320
+ return minhash
221
321
 
222
- # 清空所有数据
223
- matcher.clear()
322
+ def merge_other_minhashlsh(self, other_minhashlsh: MinHashLSH):
323
+ """
324
+ 在其他地方创建好的lsh 合并进来
325
+ """
326
+ self.lsh.merge(other_minhashlsh)
@@ -1,6 +1,8 @@
1
1
  # 某些业务中的字符串处理 算是特定场景的工具 不算通用工具
2
2
  import re
3
3
 
4
+ from re_common.v2.baselibrary.utils.string_bool import is_all_symbols
5
+
4
6
 
5
7
  def clean_organ_postcode(organ):
6
8
  """
@@ -120,6 +122,11 @@ def deal_rel_vol(vol_str: str):
120
122
  """
121
123
  处理 期刊融合时的卷处理逻辑
122
124
  """
125
+
126
+ # 如果卷是全符号 清理掉
127
+ if is_all_symbols(vol_str):
128
+ vol_str = ""
129
+
123
130
  if vol_str.replace(".", "").isdigit():
124
131
  try:
125
132
  float_num = float(vol_str)
@@ -156,20 +163,27 @@ def deal_num_strs(input_str):
156
163
  return input_str
157
164
 
158
165
 
159
- def deal_num(strs):
166
+ def deal_num(num_str):
160
167
  """
161
168
  将 期格式化 方便 group尤其是有横杆的数据
162
169
  该方法 为融合二次分割时使用,如果场景合适也可以用于其他地方
163
170
  :param strs:
164
171
  :return:
165
172
  """
166
- strs = strs.replace("-", "_").replace(".", "_").upper()
167
- if strs.find("_") > -1:
168
- start, end = strs.split("_")
173
+ # 如果期是全符号清理掉
174
+ if is_all_symbols(num_str):
175
+ num_str = ""
176
+
177
+ if num_str.lower().startswith("n "):
178
+ num_str = num_str.lower().replace("n ", "").strip()
179
+
180
+ num_str = num_str.replace("-", "_").replace(".", "_").upper()
181
+ if num_str.find("_") > -1:
182
+ start, end = num_str.split("_")
169
183
  start = deal_num_strs(start)
170
184
  end = deal_num_strs(end)
171
- strs = start + "_" + end
185
+ num_str = start + "_" + end
172
186
  else:
173
- strs = deal_num_strs(strs)
187
+ num_str = deal_num_strs(num_str)
174
188
 
175
- return strs
189
+ return num_str
@@ -0,0 +1,180 @@
1
+ import pika
2
+
3
+
4
+ # https://blog.csdn.net/songfreeman/article/details/50943603
5
+ class BasePika(object):
6
+
7
+ def __init__(self, username=None, password=None, mqhost=None, virtual_host=None):
8
+ self.username = username
9
+ self.password = password
10
+ self.conn = None
11
+ self.host = mqhost
12
+ self.virtual_host = virtual_host
13
+ self.auto_ack = True
14
+
15
+ def set_default(self):
16
+ self.host = "192.168.31.79"
17
+ self.virtual_host = "vhost_NetDataGather"
18
+ self.username = "vip"
19
+ self.password = "piv$*123"
20
+
21
+ def connect_str(self,amqp_str):
22
+ parameters = pika.URLParameters(amqp_str)
23
+ self.conn = pika.BlockingConnection(parameters)
24
+
25
+ def connect(self):
26
+ """
27
+ 设置用户名 密码 进行连接
28
+ :return:
29
+ """
30
+ credentials = pika.PlainCredentials(self.username, self.password)
31
+ # parameters = pika.URLParameters('amqp://guest:guest@rabbit-server1:5672/%2F')
32
+ # 可以通过将 heartbeat 设为 0,关闭 rabbitmq 的心跳检测
33
+ parameters = pika.ConnectionParameters(host=self.host,
34
+ virtual_host=self.virtual_host,
35
+ credentials=credentials,
36
+ heartbeat=0)
37
+ self.conn = pika.BlockingConnection(parameters)
38
+
39
+ def close(self):
40
+ # 关闭消息队列
41
+ self.conn.close()
42
+
43
+ def create_channel(self):
44
+ self.channel = self.conn.channel()
45
+
46
+ def __del__(self):
47
+ self.channel.close()
48
+ self.conn.close()
49
+
50
+ def random_queue_declare(self):
51
+ """
52
+ 这样, result.method.queue 包含一个随机的队列名, 比如:看起来像 amq.gen-JzTY20BRgKO-HjmUJj0wLg.
53
+ 其次:
54
+ 一旦我们断开consumer连接,这个队列名将自动删除。这里有一个标识设置:
55
+ :return:
56
+ """
57
+ return self.channel.queue_declare("", exclusive=True)
58
+
59
+ def queue_declare(self, queue="hello", durable=False):
60
+ """
61
+ 创建目的地队列hello 取消息时也可以调用
62
+ 取消息和发送消息都调用 保证队列存在,也保证了不管服务端还是客户端先启动都有队列
63
+ durable True 为持久化
64
+ :return:
65
+ """
66
+ return self.channel.queue_declare(queue=queue, durable=durable)
67
+
68
+ def get_queue_size(self, queue="hello"):
69
+ """
70
+ 获取某个队列的长度
71
+ :param queue:
72
+ :return:
73
+ """
74
+ queue = self.queue_declare(queue=queue, durable=True)
75
+ return queue.method.message_count
76
+
77
+ def get_properties(self):
78
+ """
79
+ 与 queue_declare里的 durable = True 配合使用,
80
+ 设置给 easy_send_msg的properties
81
+ :return:
82
+ """
83
+ return pika.BasicProperties(
84
+ delivery_mode=2, # 设置消息为持久化的
85
+ )
86
+
87
+ def easy_send_msg(self, exchange="", routing_key="hello", body="hello world", properties=None):
88
+ """
89
+ 空字符串标识默认的或者匿名的exchange,如果存在routing_key, 消息路由到routing_key指定的队列中。
90
+ routing_key 标识发送到哪个队列,就是服务器上的队列名
91
+ body 发送的消息
92
+
93
+ basic_publish 如果 exchange 不是"" 但没有绑定队列 消息会消失
94
+ :return:
95
+ """
96
+ self.channel.basic_publish(exchange=exchange,
97
+ routing_key=routing_key,
98
+ body=body,
99
+ properties=properties)
100
+
101
+ def basic_ack(self, ch, method):
102
+ """
103
+ callback的消息确认
104
+ :param ch:
105
+ :param method:
106
+ :return:
107
+ """
108
+ ch.basic_ack(delivery_tag=method.delivery_tag)
109
+
110
+ def callback(self, ch, method, properties, body):
111
+ """
112
+ 从队列接收消息要更复杂一些,它需要为队列订阅一个 callback 函数来进行接收。
113
+ 当我们接收一个消息后,这个 callback 函数将会被 pika函数库自动调用,
114
+ 在我们的这个实例里面这个函数将用来打印接收的消息内容到屏幕
115
+ :param method:
116
+ :param properties:
117
+ :param body:
118
+ :return:
119
+ """
120
+ print(type(body))
121
+ print(" [x] Received %r" % body)
122
+ if self.auto_ack is False:
123
+ self.basic_ack(ch, method)
124
+
125
+ def set_get_msg_callback(self, routing_key="hello", callback=None, auto_ack=True):
126
+ """
127
+ 设置取消息的callback
128
+ no_ack 如果设置为True,将使用自动确认模式
129
+ no_ack 如果设置为False,在callback中确认
130
+ :return:
131
+ """
132
+ self.auto_ack = auto_ack
133
+ if callback is None:
134
+ callback = self.callback
135
+ self.channel.basic_consume(routing_key,
136
+ callback,
137
+ auto_ack=auto_ack)
138
+
139
+ def start_get_msg(self):
140
+ """
141
+ 开始取消息,会循环不停的取消息
142
+ :return:
143
+ """
144
+ self.channel.start_consuming()
145
+
146
+ def basic_qos(self, prefetch_count=1):
147
+ """
148
+ 可以提前发送几个消息来,当auto_ack=True时无效
149
+ prefetch_count==1 消息未处理完前不要发送信息的消息
150
+ :return:
151
+ """
152
+ self.channel.basic_qos(prefetch_count=prefetch_count)
153
+
154
+ def exchange_declare(self, exchangename="logs", type="fanout"):
155
+ """
156
+ fanout exchange非常简单,你从这个名字中就能猜出来,它将从Producer方收到的消息广播给所有他知道的receiver方。而这正是我们的logger记录所需要的消息。
157
+ 交换的类型
158
+ 直接交换(direct exchange)的路由算法很简单 -- 消息发送到绑定键值(binding key) 刚好完全符合路由键值( routing key) 的消息队列中。
159
+
160
+ 消息发送到一个 topic交换不能是一个任意的 routing_key -- 它必须是一个用小数点 分割的单词列表。 这个字符可以是任何单词,但是通常是指定一些连接特定消息的功能。一些有效的路由键(routing key)比如:“stock.usd.nyse",
161
+ topic 是 直接交换的升级版
162
+
163
+ headers Exchange :headers交换器允许你匹配AMQP消息的header而非路由键。除此之外,headers交换器和direct交换器完全一致,但性能会差很多。因此它并不太实用,而且几乎再也用不到了。
164
+ exchangename接下来会与队列绑定
165
+ direct , topic , headers 和 fanout
166
+ :return:
167
+ """
168
+ return self.channel.exchange_declare(exchange=exchangename,
169
+ exchange_type=type)
170
+
171
+ def queue_bind(self, exchange="logs", queue="", routing_key=""):
172
+ """
173
+ queue 临时队列获取 self.random_queue_declare().method.queue
174
+ :param exchange:
175
+ :param queue:
176
+ :return:
177
+ """
178
+ self.channel.queue_bind(exchange=exchange,
179
+ queue=queue,
180
+ routing_key=routing_key)
@@ -0,0 +1,83 @@
1
+ import logging
2
+ import traceback
3
+
4
+ from re_common.v2.baselibrary.utils.basepika import BasePika
5
+ from retry import retry
6
+
7
+ logging_logger = logging.getLogger(__name__)
8
+
9
+
10
+ class UseMq(object):
11
+
12
+ def __init__(self, queue, qos=1):
13
+ self.queue = queue
14
+ self.qos = qos
15
+ self.basepika = BasePika()
16
+ self.basepika.set_default()
17
+ self.basepika.connect()
18
+ self.basepika.create_channel()
19
+ self.basepika.queue_declare(queue=queue, durable=True)
20
+ self.basepika.basic_qos(qos)
21
+ self.properties = self.basepika.get_properties()
22
+
23
+ def re_conn(self):
24
+ """
25
+ 重新连接
26
+ :return:
27
+ """
28
+ self.basepika.connect()
29
+ self.basepika.create_channel()
30
+ self.basepika.queue_declare(queue=self.queue, durable=True)
31
+ self.basepika.basic_qos(self.qos)
32
+
33
+ @retry(delay=5, backoff=2, max_delay=60 * 3, logger=logging_logger)
34
+ def get_mq(self):
35
+ try:
36
+ if self.basepika.channel.is_closed:
37
+ logging_logger.info("重连中......")
38
+ self.re_conn()
39
+ logging_logger.info("重连完成......")
40
+ self.basepika.set_get_msg_callback(routing_key=self.queue, callback=self.callback, auto_ack=False)
41
+ self.basepika.start_get_msg()
42
+ except:
43
+ traceback.print_exc()
44
+ logging_logger.info("重连中......")
45
+ self.re_conn()
46
+
47
+ def callback(self, ch, method, properties, body):
48
+ # print(type(body))
49
+ # print(" [x] Received %r" % body)
50
+ # body = body.decode()
51
+ self.callback2(ch, method, properties, body)
52
+ if self.basepika.auto_ack is False:
53
+ self.basepika.basic_ack(ch, method)
54
+
55
+ def callback2(self, ch, method, properties, body):
56
+ pass
57
+
58
+ @retry(delay=5, backoff=2, max_delay=60 * 3, logger=logging_logger)
59
+ def send_mq(self, body, num=100):
60
+ try:
61
+ if self.basepika.get_queue_size(self.queue) < num:
62
+ self.basepika.easy_send_msg(routing_key=self.queue,
63
+ body=body,
64
+ properties=self.properties)
65
+ return True
66
+ else:
67
+ return False
68
+ except:
69
+ traceback.print_exc()
70
+ logging_logger.info("重连中......")
71
+ self.re_conn()
72
+ return False
73
+
74
+ def get_server_mq_num(self, num=100):
75
+ if self.basepika.get_queue_size(self.queue) < num:
76
+ return True
77
+ else:
78
+ return False
79
+
80
+ def easy_send_mq(self, body):
81
+ self.basepika.easy_send_msg(routing_key=self.queue,
82
+ body=body,
83
+ properties=self.properties)