CAPE-parsers 0.1.34__tar.gz → 0.1.36__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 (115) hide show
  1. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/PKG-INFO +2 -2
  2. cape_parsers-0.1.36/cape_parsers/CAPE/community/AsyncRAT.py +29 -0
  3. cape_parsers-0.1.36/cape_parsers/CAPE/community/DCRat.py +29 -0
  4. cape_parsers-0.1.36/cape_parsers/CAPE/community/VenomRAT.py +29 -0
  5. cape_parsers-0.1.36/cape_parsers/CAPE/community/XWorm.py +29 -0
  6. cape_parsers-0.1.36/cape_parsers/CAPE/community/XenoRAT.py +29 -0
  7. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/Latrodectus.py +1 -1
  8. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/Socks5Systemz.py +1 -1
  9. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/pyproject.toml +2 -2
  10. cape_parsers-0.1.34/cape_parsers/CAPE/community/AsyncRAT.py +0 -5
  11. cape_parsers-0.1.34/cape_parsers/CAPE/community/DCRat.py +0 -5
  12. cape_parsers-0.1.34/cape_parsers/CAPE/community/VenomRAT.py +0 -5
  13. cape_parsers-0.1.34/cape_parsers/CAPE/community/XWorm.py +0 -5
  14. cape_parsers-0.1.34/cape_parsers/CAPE/community/XenoRAT.py +0 -5
  15. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/LICENSE +0 -0
  16. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/README.md +0 -0
  17. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/__init__.py +0 -0
  18. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/AgentTesla.py +0 -0
  19. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/Arkei.py +0 -0
  20. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/AuroraStealer.py +0 -0
  21. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/BackOffLoader.py +0 -0
  22. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/BackOffPOS.py +0 -0
  23. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/BlackNix.py +0 -0
  24. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/Carbanak.py +0 -0
  25. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/CobaltStrikeBeacon.py +0 -0
  26. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/CobaltStrikeStager.py +0 -0
  27. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/Fareit.py +0 -0
  28. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/Greame.py +0 -0
  29. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/KoiLoader.py +0 -0
  30. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/LokiBot.py +0 -0
  31. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/Lumma.py +0 -0
  32. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/NanoCore.py +0 -0
  33. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/Nighthawk.py +0 -0
  34. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/Njrat.py +0 -0
  35. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/Pandora.py +0 -0
  36. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/PhemedroneStealer.py +0 -0
  37. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/PoisonIvy.py +0 -0
  38. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/Punisher.py +0 -0
  39. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/QuasarRAT.py +0 -0
  40. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/README.md +0 -0
  41. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/REvil.py +0 -0
  42. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/Retefe.py +0 -0
  43. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/Rozena.py +0 -0
  44. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/SmallNet.py +0 -0
  45. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/Snake.py +0 -0
  46. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/SparkRAT.py +0 -0
  47. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/Stealc.py +0 -0
  48. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/TSCookie.py +0 -0
  49. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/TrickBot.py +0 -0
  50. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/community/__init__.py +0 -0
  51. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/Azorult.py +0 -0
  52. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/BitPaymer.py +0 -0
  53. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/BlackDropper.py +0 -0
  54. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/Blister.py +0 -0
  55. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/BruteRatel.py +0 -0
  56. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/BuerLoader.py +0 -0
  57. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/BumbleBee.py +0 -0
  58. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/ChChes.py +0 -0
  59. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/DarkGate.py +0 -0
  60. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/DoppelPaymer.py +0 -0
  61. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/DridexLoader.py +0 -0
  62. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/Emotet.py +0 -0
  63. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/Enfal.py +0 -0
  64. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/EvilGrab.py +0 -0
  65. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/Formbook.py +0 -0
  66. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/GuLoader.py +0 -0
  67. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/HttpBrowser.py +0 -0
  68. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/IcedID.py +0 -0
  69. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/IcedIDLoader.py +0 -0
  70. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/Oyster.py +0 -0
  71. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/PikaBot.py +0 -0
  72. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/PlugX.py +0 -0
  73. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/QakBot.py +0 -0
  74. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/Quickbind.py +0 -0
  75. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/RCSession.py +0 -0
  76. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/README.md +0 -0
  77. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/RedLeaf.py +0 -0
  78. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/RedLine.py +0 -0
  79. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/Remcos.py +0 -0
  80. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/Rhadamanthys.py +0 -0
  81. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/SmokeLoader.py +0 -0
  82. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/SquirrelWaffle.py +0 -0
  83. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/Strrat.py +0 -0
  84. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/UrsnifV3.py +0 -0
  85. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/WarzoneRAT.py +0 -0
  86. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/Zloader.py +0 -0
  87. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/__init__.py +0 -0
  88. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/CAPE/core/test_cape.py +0 -0
  89. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/RATDecoders/README.md +0 -0
  90. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/RATDecoders/__init__.py +0 -0
  91. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/RATDecoders/test_rats.py +0 -0
  92. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/__init__.py +0 -0
  93. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/deprecated/Hancitor.py +0 -0
  94. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/deprecated/JavaDropper.py +0 -0
  95. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/deprecated/Nymaim.py +0 -0
  96. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/deprecated/PredatorPain.py +0 -0
  97. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/deprecated/_ShadowTech.py +0 -0
  98. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/deprecated/_VirusRat.py +0 -0
  99. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/deprecated/_jRat.py +0 -0
  100. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/deprecated/unrecom.py +0 -0
  101. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/deprecated/xRAT.py +0 -0
  102. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/malduck/LICENSE +0 -0
  103. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/malduck/README.md +0 -0
  104. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/malduck/__init__.py +0 -0
  105. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/malduck/test_malduck.py +0 -0
  106. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/mwcp/README.md +0 -0
  107. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/mwcp/__init__.py +0 -0
  108. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/mwcp/test_mwcp.py +0 -0
  109. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/utils/__init__.py +0 -0
  110. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/utils/aplib.py +0 -0
  111. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/utils/blzpack.py +0 -0
  112. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/utils/blzpack_lib.so +0 -0
  113. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/utils/dotnet_utils.py +0 -0
  114. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/utils/lznt1.py +0 -0
  115. {cape_parsers-0.1.34 → cape_parsers-0.1.36}/cape_parsers/utils/strings.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: CAPE-parsers
3
- Version: 0.1.34
3
+ Version: 0.1.36
4
4
  Summary: CAPE: Malware Configuration Extraction
5
5
  License: MIT
6
6
  Keywords: cape,parsers,malware,configuration
@@ -21,7 +21,7 @@ Requires-Dist: maco (==1.1.8) ; extra == "maco"
21
21
  Requires-Dist: netstruct (==1.1.2)
22
22
  Requires-Dist: pefile
23
23
  Requires-Dist: pycryptodomex (>=3.20.0)
24
- Requires-Dist: rat-king-parser (>=4.0.0)
24
+ Requires-Dist: rat-king-parser (>=4.1.0)
25
25
  Requires-Dist: ruff (>=0.7.2)
26
26
  Requires-Dist: unicorn (==2.1.1)
27
27
  Requires-Dist: yara-python (>=4.5.1)
@@ -0,0 +1,29 @@
1
+ import importlib.util
2
+ import sys
3
+ import os
4
+
5
+ from rat_king_parser.rkp import RATConfigParser
6
+
7
+ HAVE_ASYNCRAT_COMMON = False
8
+ module_file_path = '/opt/CAPEv2/data/asyncrat_common.py'
9
+ if os.path.exists(module_file_path):
10
+ try:
11
+ module_name = os.path.basename(module_file_path).replace('.py', '')
12
+ spec = importlib.util.spec_from_file_location(module_name, module_file_path)
13
+ asyncrat_common = importlib.util.module_from_spec(spec)
14
+ sys.modules[module_name] = asyncrat_common
15
+ spec.loader.exec_module(asyncrat_common)
16
+ HAVE_ASYNCRAT_COMMON = True
17
+ except Exception as e:
18
+ print("Error loading asyncrat_common.py", e)
19
+
20
+ def extract_config(data: bytes):
21
+ config = RATConfigParser(data=data, remap_config=True).report.get("config", {})
22
+ if config and HAVE_ASYNCRAT_COMMON:
23
+ config = asyncrat_common.convert_config(config)
24
+
25
+ return config
26
+
27
+ if __name__ == "__main__":
28
+ data = open(sys.argv[1], "rb").read()
29
+ print(extract_config(data))
@@ -0,0 +1,29 @@
1
+ import importlib.util
2
+ import sys
3
+ import os
4
+
5
+ from rat_king_parser.rkp import RATConfigParser
6
+
7
+ HAVE_ASYNCRAT_COMMON = False
8
+ module_file_path = '/opt/CAPEv2/data/asyncrat_common.py'
9
+ if os.path.exists(module_file_path):
10
+ try:
11
+ module_name = os.path.basename(module_file_path).replace('.py', '')
12
+ spec = importlib.util.spec_from_file_location(module_name, module_file_path)
13
+ asyncrat_common = importlib.util.module_from_spec(spec)
14
+ sys.modules[module_name] = asyncrat_common
15
+ spec.loader.exec_module(asyncrat_common)
16
+ HAVE_ASYNCRAT_COMMON = True
17
+ except Exception as e:
18
+ print("Error loading asyncrat_common.py", e)
19
+
20
+ def extract_config(data: bytes):
21
+ config = RATConfigParser(data=data, remap_config=True).report.get("config", {})
22
+ if config and HAVE_ASYNCRAT_COMMON:
23
+ config = asyncrat_common.convert_config(config)
24
+
25
+ return config
26
+
27
+ if __name__ == "__main__":
28
+ data = open(sys.argv[1], "rb").read()
29
+ print(extract_config(data))
@@ -0,0 +1,29 @@
1
+ import importlib.util
2
+ import sys
3
+ import os
4
+
5
+ from rat_king_parser.rkp import RATConfigParser
6
+
7
+ HAVE_ASYNCRAT_COMMON = False
8
+ module_file_path = '/opt/CAPEv2/data/asyncrat_common.py'
9
+ if os.path.exists(module_file_path):
10
+ try:
11
+ module_name = os.path.basename(module_file_path).replace('.py', '')
12
+ spec = importlib.util.spec_from_file_location(module_name, module_file_path)
13
+ asyncrat_common = importlib.util.module_from_spec(spec)
14
+ sys.modules[module_name] = asyncrat_common
15
+ spec.loader.exec_module(asyncrat_common)
16
+ HAVE_ASYNCRAT_COMMON = True
17
+ except Exception as e:
18
+ print("Error loading asyncrat_common.py", e)
19
+
20
+ def extract_config(data: bytes):
21
+ config = RATConfigParser(data=data, remap_config=True).report.get("config", {})
22
+ if config and HAVE_ASYNCRAT_COMMON:
23
+ config = asyncrat_common.convert_config(config)
24
+
25
+ return config
26
+
27
+ if __name__ == "__main__":
28
+ data = open(sys.argv[1], "rb").read()
29
+ print(extract_config(data))
@@ -0,0 +1,29 @@
1
+ import importlib.util
2
+ import sys
3
+ import os
4
+
5
+ from rat_king_parser.rkp import RATConfigParser
6
+
7
+ HAVE_ASYNCRAT_COMMON = False
8
+ module_file_path = '/opt/CAPEv2/data/asyncrat_common.py'
9
+ if os.path.exists(module_file_path):
10
+ try:
11
+ module_name = os.path.basename(module_file_path).replace('.py', '')
12
+ spec = importlib.util.spec_from_file_location(module_name, module_file_path)
13
+ asyncrat_common = importlib.util.module_from_spec(spec)
14
+ sys.modules[module_name] = asyncrat_common
15
+ spec.loader.exec_module(asyncrat_common)
16
+ HAVE_ASYNCRAT_COMMON = True
17
+ except Exception as e:
18
+ print("Error loading asyncrat_common.py", e)
19
+
20
+ def extract_config(data: bytes):
21
+ config = RATConfigParser(data=data, remap_config=True).report.get("config", {})
22
+ if config and HAVE_ASYNCRAT_COMMON:
23
+ config = asyncrat_common.convert_config(config)
24
+
25
+ return config
26
+
27
+ if __name__ == "__main__":
28
+ data = open(sys.argv[1], "rb").read()
29
+ print(extract_config(data))
@@ -0,0 +1,29 @@
1
+ import importlib.util
2
+ import sys
3
+ import os
4
+
5
+ from rat_king_parser.rkp import RATConfigParser
6
+
7
+ HAVE_ASYNCRAT_COMMON = False
8
+ module_file_path = '/opt/CAPEv2/data/asyncrat_common.py'
9
+ if os.path.exists(module_file_path):
10
+ try:
11
+ module_name = os.path.basename(module_file_path).replace('.py', '')
12
+ spec = importlib.util.spec_from_file_location(module_name, module_file_path)
13
+ asyncrat_common = importlib.util.module_from_spec(spec)
14
+ sys.modules[module_name] = asyncrat_common
15
+ spec.loader.exec_module(asyncrat_common)
16
+ HAVE_ASYNCRAT_COMMON = True
17
+ except Exception as e:
18
+ print("Error loading asyncrat_common.py", e)
19
+
20
+ def extract_config(data: bytes):
21
+ config = RATConfigParser(data=data, remap_config=True).report.get("config", {})
22
+ if config and HAVE_ASYNCRAT_COMMON:
23
+ config = asyncrat_common.convert_config(config)
24
+
25
+ return config
26
+
27
+ if __name__ == "__main__":
28
+ data = open(sys.argv[1], "rb").read()
29
+ print(extract_config(data))
@@ -168,7 +168,7 @@ def extract_config(filebuf):
168
168
 
169
169
  if is_aes and key:
170
170
  for i in range(len(data)):
171
- str_val = get_aes_string(data[i : i + 256], key)
171
+ str_val = get_aes_string(data[i : i + 512], key)
172
172
  if str_val and len(str_val) > 2:
173
173
  str_vals.append(str_val)
174
174
  else:
@@ -20,6 +20,6 @@ def extract_config(data):
20
20
  config_dict["C2s"].append(line)
21
21
  elif line and "\\" in line:
22
22
  config_dict.setdefault("Timestamp path", []).append(line)
23
- elif "." in line:
23
+ elif "." in line and "=" not in line and line not in config_dict["C2s"]:
24
24
  config_dict.setdefault("Dummy domain", []).append(line)
25
25
  return config_dict
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "CAPE-parsers"
3
- version = "0.1.34"
3
+ version = "0.1.36"
4
4
  description = "CAPE: Malware Configuration Extraction"
5
5
  authors = ["Kevin O'Reilly <kev@capesandbox.com>", "doomedraven <doomedraven@capesandbox.com>"]
6
6
  license = "MIT"
@@ -24,7 +24,7 @@ yara-python = ">=4.5.1"
24
24
  dnfile = ">=0.15.1"
25
25
  dncil = ">=1.0.2"
26
26
  unicorn = "2.1.1"
27
- rat-king-parser = ">=4.0.0"
27
+ rat-king-parser = ">=4.1.0"
28
28
 
29
29
  ruff = ">=0.7.2"
30
30
  # isort = ">=5.13.2"
@@ -1,5 +0,0 @@
1
- from rat_king_parser.rkp import RATConfigParser
2
-
3
-
4
- def extract_config(data: bytes):
5
- return RATConfigParser(data=data).report.get("config", {})
@@ -1,5 +0,0 @@
1
- from rat_king_parser.rkp import RATConfigParser
2
-
3
-
4
- def extract_config(data: bytes):
5
- return RATConfigParser(data=data).report.get("config", {})
@@ -1,5 +0,0 @@
1
- from rat_king_parser.rkp import RATConfigParser
2
-
3
-
4
- def extract_config(data: bytes):
5
- return RATConfigParser(data=data).report.get("config", {})
@@ -1,5 +0,0 @@
1
- from rat_king_parser.rkp import RATConfigParser
2
-
3
-
4
- def extract_config(data: bytes):
5
- return RATConfigParser(data=data).report.get("config", {})
@@ -1,5 +0,0 @@
1
- from rat_king_parser.rkp import RATConfigParser
2
-
3
-
4
- def extract_config(data: bytes):
5
- return RATConfigParser(data=data).report.get("config", {})
File without changes
File without changes