atomicshop 2.9.33__py3-none-any.whl → 2.10.0__py3-none-any.whl

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.

Potentially problematic release.


This version of atomicshop might be problematic. Click here for more details.

atomicshop/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
1
  """Atomic Basic functions and classes to make developer life easier"""
2
2
 
3
3
  __author__ = "Den Kras"
4
- __version__ = '2.9.33'
4
+ __version__ = '2.10.0'
@@ -6,10 +6,15 @@ DEFAULT_KIBANA_PORT: str = '5601'
6
6
  DEFAULT_KIBANA_HOST: str = 'localhost'
7
7
  DEFAULT_KIBANA_URL: str = f"http://{DEFAULT_KIBANA_HOST}:{DEFAULT_KIBANA_PORT}"
8
8
 
9
- ELASTIC_CONFIG_FILE: str = "/etc/elasticsearch/elasticsearch.yml"
10
- ELASTIC_JVM_OPTIONS_FILE: str = "/etc/elasticsearch/jvm.options"
9
+ ELASTIC_SEARCH_CONFIG_DIRECTORY: str = "/etc/elasticsearch"
10
+
11
+ ELASTIC_CONFIG_FILE: str = f"{ELASTIC_SEARCH_CONFIG_DIRECTORY}/elasticsearch.yml"
11
12
  XPACK_SECURITY_SETTING_NAME: str = "xpack.security.enabled"
12
13
 
14
+ ELASTIC_JVM_OPTIONS_DIRECTORY: str = f"{ELASTIC_SEARCH_CONFIG_DIRECTORY}/jvm.options.d"
15
+ ELASTIC_JVM_OPTIONS_CUSTOM_FILE: str = f"{ELASTIC_JVM_OPTIONS_DIRECTORY}/custom.options"
16
+ ELASTIC_JVM_OPTIONS_4GB_MEMORY_USAGE: list[str] = ['-Xms4g', '-Xmx4g']
17
+
13
18
  UBUNTU_DEPENDENCY_PACKAGES: list[str] = ['apt-transport-https', 'openjdk-11-jdk', 'wget']
14
19
  UBUNTU_ELASTIC_PACKAGE_NAME: str = 'elasticsearch'
15
20
  UBUNTU_ELASTIC_SERVICE_NAME: str = 'elasticsearch'
@@ -170,6 +170,29 @@ def modify_xpack_security_setting(
170
170
  print_api(f"The setting is already set to [{setting}].")
171
171
 
172
172
 
173
+ def create_jvm_options_custom_file(file_path: str = None, options: list = None):
174
+ """
175
+ The function creates a custom JVM options file for Elasticsearch.
176
+ The default file path is 'config_basic.ELASTIC_JVM_OPTIONS_CUSTOM_FILE'.
177
+ The default options are 'config_basic.ELASTIC_JVM_OPTIONS_4GB_MEMORY_USAGE'.
178
+ The 4GB memory usage options are needed for the Elasticsearch to work properly and not to crash.
179
+ :param file_path: str, the path to the custom JVM options file.
180
+ :param options: list, the list of JVM options.
181
+ :return:
182
+ """
183
+
184
+ if not file_path:
185
+ file_path = config_basic.ELASTIC_JVM_OPTIONS_CUSTOM_FILE
186
+
187
+ if not options:
188
+ options = config_basic.ELASTIC_JVM_OPTIONS_4GB_MEMORY_USAGE
189
+
190
+ # Write the options to the file.
191
+ with open(file_path, 'w') as file:
192
+ for option in options:
193
+ file.write(f"{option}\n")
194
+
195
+
173
196
  def is_server_available(
174
197
  max_attempts: int = 5,
175
198
  wait_between_attempts_seconds: float = 10,
@@ -215,6 +215,12 @@ def install_elastic_kibana_ubuntu(install_elastic: bool = True, install_kibana:
215
215
 
216
216
  infrastructure.start_elastic_and_check_service_availability()
217
217
 
218
+ print_api("Creating custom JVM options file with 4GB memory usage.")
219
+ infrastructure.create_jvm_options_custom_file(
220
+ file_path=config_basic.ELASTIC_JVM_OPTIONS_CUSTOM_FILE,
221
+ options=config_basic.ELASTIC_JVM_OPTIONS_4GB_MEMORY_USAGE
222
+ )
223
+
218
224
  if install_kibana:
219
225
  # Install Kibana.
220
226
  ubuntu_terminal.install_packages([config_basic.UBUNTU_KIBANA_PACKAGE_NAME])
@@ -1,18 +1,79 @@
1
1
  import requests
2
2
  import fnmatch
3
3
 
4
- from ..web import download_and_extract_file
4
+ from .. import web, urls
5
5
  from ..print_api import print_api
6
- from ..urls import url_parser
7
6
 
8
7
 
9
8
  class GitHubWrapper:
10
9
  # You also can use '.tar.gz' as extension.
11
10
  def __init__(
12
- self, user_name: str = str(), repo_name: str = str(), repo_url: str = str(),
13
- branch: str = 'master', branch_file_extension: str = '.zip'):
11
+ self,
12
+ user_name: str = None,
13
+ repo_name: str = None,
14
+ repo_url: str = None,
15
+ branch: str = 'master',
16
+ branch_file_extension: str = '.zip'
17
+ ):
18
+ """
19
+ This class is a wrapper for GitHub repositories. It can download the branch file from the repository and extract
20
+ it to the target directory and more.
21
+
22
+ :param user_name: str, the user-name of the repository.
23
+ https://github.com/{user_name}/{repo_name}
24
+ :param repo_name: str, the repository name.
25
+ :param repo_url: str, the repository url.
26
+ You can provide the full url to the repository directly and then extract the user_name and repo_name from it
27
+ with the 'build_links_from_repo_url' function.
28
+ :param branch: str, the branch name. The default is 'master'.
29
+ :param branch_file_extension: str, the branch file extension. The default is '.zip'.
30
+
31
+ ================================================================================================================
32
+ Usage to download the 'master' branch file:
33
+ git_wrapper = GitHubWrapper(user_name='user_name', repo_name='repo_name')
34
+ git_wrapper.download_and_extract_branch(target_directory='target_directory')
35
+
36
+ Usage to download the 'main' branch file:
37
+ git_wrapper = GitHubWrapper(user_name='user_name', repo_name='repo_name', branch='main')
38
+ git_wrapper.download_and_extract_branch(target_directory='target_directory')
39
+
40
+ You can provide the user_name and repo_name after the initialization of the class:
41
+ git_wrapper = GitHubWrapper()
42
+ git_wrapper.user_name = 'user_name'
43
+ git_wrapper.repo_name = 'repo_name'
44
+ git_wrapper.build_links_from_user_and_repo()
45
+ git_wrapper.download_and_extract_branch(target_directory='target_directory')
46
+ ================================================================================================================
47
+ Usage to download the 'master' branch file from the repository url:
48
+ git_wrapper = GitHubWrapper(repo_url='http://github.com/user_name/repo_name')
49
+ git_wrapper.download_and_extract_branch(target_directory='target_directory')
50
+
51
+ Usage to download the 'main' branch file from the repository url:
52
+ git_wrapper = GitHubWrapper(repo_url='http://github.com/user_name/repo_name', branch='main')
53
+ git_wrapper.download_and_extract_branch(target_directory='target_directory')
54
+
55
+ You can provide the repo_url after the initialization of the class:
56
+ git_wrapper = GitHubWrapper()
57
+ git_wrapper.repo_url = 'http://github.com/user_name/repo_name'
58
+ git_wrapper.build_links_from_repo_url()
59
+ git_wrapper.download_and_extract_branch(target_directory='target_directory')
60
+ ================================================================================================================
61
+ Usage to download the latest release where the file name is 'test_file.zip':
62
+ git_wrapper = GitHubWrapper(user_name='user_name', repo_name='repo_name')
63
+ git_wrapper.download_and_extract_latest_release(
64
+ target_directory='target_directory', string_pattern='test_*.zip')
65
+ ================================================================================================================
66
+ Usage to get the latest release json:
67
+ git_wrapper = GitHubWrapper(user_name='user_name', repo_name='repo_name')
68
+ git_wrapper.get_the_latest_release_json()
69
+ ================================================================================================================
70
+ Usage to get the latest release version:
71
+ git_wrapper = GitHubWrapper(user_name='user_name', repo_name='repo_name')
72
+ git_wrapper.get_the_latest_release_version_number()
73
+ """
74
+
14
75
  self.user_name: str = user_name
15
- self.repo_name = repo_name
76
+ self.repo_name: str = repo_name
16
77
  self.repo_url: str = repo_url
17
78
  self.branch: str = branch
18
79
  self.branch_file_extension: str = branch_file_extension
@@ -27,6 +88,12 @@ class GitHubWrapper:
27
88
  self.branch_downloaded_folder_name: str = str()
28
89
  self.latest_release_json_url: str = str()
29
90
 
91
+ if self.user_name and self.repo_name and not self.repo_url:
92
+ self.build_links_from_user_and_repo()
93
+
94
+ if self.repo_url and not self.user_name and not self.repo_name:
95
+ self.build_links_from_repo_url()
96
+
30
97
  def build_links_from_user_and_repo(self, **kwargs):
31
98
  if not self.user_name or not self.repo_name:
32
99
  message = "'user_name' or 'repo_name' is empty."
@@ -43,7 +110,7 @@ class GitHubWrapper:
43
110
  message = "'repo_url' is empty."
44
111
  print_api(message, color="red", error_type=True, **kwargs)
45
112
 
46
- repo_url_parsed = url_parser(self.repo_url)
113
+ repo_url_parsed = urls.url_parser(self.repo_url)
47
114
  self.check_github_domain(repo_url_parsed['netloc'])
48
115
  self.user_name = repo_url_parsed['directories'][0]
49
116
  self.repo_name = repo_url_parsed['directories'][1]
@@ -73,20 +140,32 @@ class GitHubWrapper:
73
140
  """
74
141
 
75
142
  # Download the repo to current working directory, extract and remove the archive.
76
- download_and_extract_file(
143
+ web.download_and_extract_file(
77
144
  file_url=self.branch_download_link,
78
145
  target_directory=target_directory,
79
146
  archive_remove_first_directory=archive_remove_first_directory,
80
147
  **kwargs)
81
148
 
82
149
  def download_and_extract_latest_release(
83
- self, target_directory: str, string_pattern: str,
84
- archive_remove_first_directory: bool = False, **kwargs):
85
- # Download latest release url.
86
- response = requests.get(self.latest_release_json_url)
87
- # Response from the latest releases page is json. Convert response to json from downloaded format and get
88
- # 'assets' key.
89
- github_latest_releases_list = response.json()['assets']
150
+ self,
151
+ target_directory: str,
152
+ string_pattern: str,
153
+ archive_remove_first_directory: bool = False,
154
+ **kwargs):
155
+ """
156
+ This function will download the latest release from the GitHub repository, extract the file and remove the file,
157
+ leaving only the extracted folder.
158
+ :param target_directory: str, the target directory to download and extract the file.
159
+ :param string_pattern: str, the string pattern to search in the latest release. Wildcards can be used.
160
+ :param archive_remove_first_directory: bool, sets if archive extract function will extract the archive
161
+ without first directory in the archive. Check reference in the
162
+ 'archiver.zip.extract_archive_with_zipfile' function.
163
+ :param kwargs: dict, the print arguments for the 'print_api' function.
164
+ :return:
165
+ """
166
+
167
+ # Get the 'assets' key of the latest release json.
168
+ github_latest_releases_list = self.get_the_latest_release_json()['assets']
90
169
 
91
170
  # Get only download urls of the latest releases.
92
171
  download_urls: list = list()
@@ -103,8 +182,23 @@ class GitHubWrapper:
103
182
  f'{found_urls}'
104
183
  print_api(message, color="red", error_type=True, **kwargs)
105
184
 
106
- download_and_extract_file(
185
+ web.download_and_extract_file(
107
186
  file_url=found_urls[0],
108
187
  target_directory=target_directory,
109
188
  archive_remove_first_directory=archive_remove_first_directory,
110
189
  **kwargs)
190
+
191
+ def get_the_latest_release_json(self):
192
+ """
193
+ This function will get the latest releases json.
194
+ :return:
195
+ """
196
+ response = requests.get(self.latest_release_json_url)
197
+ return response.json()
198
+
199
+ def get_the_latest_release_version_number(self):
200
+ """
201
+ This function will get the latest release version number.
202
+ :return:
203
+ """
204
+ return self.get_the_latest_release_json()['tag_name']
@@ -1,7 +1,8 @@
1
1
  import subprocess
2
- import getpass
2
+ import requests
3
3
 
4
- from ... import process, filesystem, permissions
4
+ from ...basics import booleans
5
+ from .. import githubw, ubuntu_terminal
5
6
  from ...print_api import print_api
6
7
 
7
8
 
@@ -28,22 +29,103 @@ def is_nodejs_installed():
28
29
  return False
29
30
 
30
31
 
31
- def install_nodejs_ubuntu():
32
+ def get_nodejs_latest_version_number(
33
+ by_github_api: bool = True,
34
+ _by_nodejs_website: bool = False,
35
+ get_major: bool = False
36
+ ) -> str:
37
+ """
38
+ The function will get the latest version number of Node.js.
39
+ :param by_github_api: bool, if True, the function will get the version number using the GitHub API.
40
+ Limitations: rate limits apply.
41
+ :param _by_nodejs_website: bool, if True, the function will get the version number using the Node.js website.
42
+ Limitations: the website structure can change and the json file is relatively large.
43
+ This is only for reference, it is not tested.
44
+ :param get_major: bool, if True, the function will return only the major version number string.
45
+ :return: str.
46
+ """
47
+
48
+ if by_github_api and _by_nodejs_website:
49
+ raise ValueError("Only one of the arguments can be True.")
50
+ elif not by_github_api and not _by_nodejs_website:
51
+ raise ValueError("At least one of the arguments must be True.")
52
+
53
+ latest_version = ''
54
+ if by_github_api:
55
+ github_wrapper = githubw.GitHubWrapper('nodejs', 'node')
56
+ latest_version = github_wrapper.get_the_latest_release_version_number()
57
+ elif _by_nodejs_website:
58
+ url = "https://nodejs.org/dist/index.json"
59
+ response = requests.get(url)
60
+ versions = response.json()
61
+ latest_version = versions[0]['version'] # Assuming the first one is the latest.
62
+
63
+ if get_major:
64
+ latest_version = latest_version.replace('v', '')
65
+ latest_version = latest_version.split('.')[0]
66
+
67
+ return latest_version
68
+
69
+
70
+ def install_nodejs_ubuntu(
71
+ install_latest_version: bool = False,
72
+ install_lts: bool = True,
73
+ install_by_version_number: str = None,
74
+ force_install: bool = False
75
+ ):
32
76
  """
33
77
  The function will install Node.js on Ubuntu.
78
+
79
+ :param install_latest_version: bool, if True, the function will install the latest version of Node.js.
80
+ :param install_lts: bool, if True, the function will install the LTS version of Node.js.
81
+ :param install_by_version_number: str, the version number of Node.js to install.
82
+ :param force_install: bool, if True, the function will install Node.js even if it is already installed.
83
+
34
84
  :return:
35
85
  """
36
86
 
87
+ booleans.check_3_booleans_when_only_1_can_be_true(
88
+ (install_latest_version, 'install_latest_version'),
89
+ (install_lts, 'install_lts'),
90
+ (install_by_version_number, 'install_by_version_number')
91
+ )
92
+
37
93
  # Check if Node.js is already installed.
38
94
  if is_nodejs_installed():
39
- return
95
+ if not force_install:
96
+ return
40
97
 
41
- # Add the Node.js repository.
42
- process.run_command(['curl', '-sL', 'https://deb.nodesource.com/setup_14.x', '-o', '/tmp/nodesource_setup.sh'])
43
- process.run_command(['bash', '/tmp/nodesource_setup.sh'])
98
+ print_api("Adding NodeSource repository...")
44
99
 
45
- # Install Node.js
46
- process.run_command(['apt-get', 'install', '-y', 'nodejs'])
100
+ # Fetch and execute the NodeSource repository setup script.
101
+ if install_latest_version:
102
+ install_by_version_number: str = get_nodejs_latest_version_number(get_major=True)
103
+
104
+ command: str = ''
105
+ if install_latest_version or install_by_version_number:
106
+ command = f"curl -fsSL https://deb.nodesource.com/setup_{install_by_version_number}.x | sudo -E bash -"
107
+ elif install_lts:
108
+ command = "curl -fsSL https://deb.nodesource.com/setup_current.x | sudo -E bash -"
109
+
110
+ _ = subprocess.check_output(command, shell=True, stderr=subprocess.STDOUT)
111
+
112
+ ubuntu_terminal.update_system_packages()
113
+ ubuntu_terminal.install_packages(['nodejs'])
114
+
115
+ # Check if Node.js is installed.
116
+ is_nodejs_installed()
117
+
118
+
119
+ def install_npm_package_ubuntu(package_name: str):
120
+ """
121
+ The function will install a npm package on Ubuntu.
122
+ :param package_name: str, the name of the package to install.
123
+ :return:
124
+ """
47
125
 
48
126
  # Check if Node.js is installed.
49
- is_nodejs_installed()
127
+ if not is_nodejs_installed():
128
+ return
129
+
130
+ command = f"npm install -g {package_name}"
131
+ _ = subprocess.check_output(command, shell=True, stderr=subprocess.STDOUT)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: atomicshop
3
- Version: 2.9.33
3
+ Version: 2.10.0
4
4
  Summary: Atomic functions and classes to make developer life easier
5
5
  Author: Denis Kras
6
6
  License: MIT License
@@ -1,4 +1,4 @@
1
- atomicshop/__init__.py,sha256=xZ_X7wkuj9RC8hITqUIPCnbV_tPMEP3Ct3FVSt2GWdM,123
1
+ atomicshop/__init__.py,sha256=Vb-OirUUuTpKZXUvWHYjzscN4SeetO7oxaKph1XstLw,123
2
2
  atomicshop/_basics_temp.py,sha256=6cu2dd6r2dLrd1BRNcVDKTHlsHs_26Gpw8QS6v32lQ0,3699
3
3
  atomicshop/_create_pdf_demo.py,sha256=Yi-PGZuMg0RKvQmLqVeLIZYadqEZwUm-4A9JxBl_vYA,3713
4
4
  atomicshop/_patch_import.py,sha256=ENp55sKVJ0e6-4lBvZnpz9PQCt3Otbur7F6aXDlyje4,6334
@@ -143,7 +143,7 @@ atomicshop/wrappers/astw.py,sha256=VkYfkfyc_PJLIOxByT6L7B8uUmKY6-I8XGZl4t_z828,4
143
143
  atomicshop/wrappers/configparserw.py,sha256=JwDTPjZoSrv44YKwIRcjyUnpN-FjgXVfMqMK_tJuSgU,22800
144
144
  atomicshop/wrappers/cryptographyw.py,sha256=H5NaHHDkr97QYhUrHFO9vY218u8k3N3Zgh6bQRnicUE,13140
145
145
  atomicshop/wrappers/ffmpegw.py,sha256=wcq0ZnAe0yajBOuTKZCCaKI7CDBjkq7FAgdW5IsKcVE,6031
146
- atomicshop/wrappers/githubw.py,sha256=AjD0VUlV2Kcddns2OaGmyX-FOAvdps-8SPSWS05E0QA,4809
146
+ atomicshop/wrappers/githubw.py,sha256=mQGtj6up1HIvjOD2t0bmOWjLooJLYvuIa7d7H-tknrw,9998
147
147
  atomicshop/wrappers/numpyw.py,sha256=sBV4gSKyr23kXTalqAb1oqttzE_2XxBooCui66jbAqc,1025
148
148
  atomicshop/wrappers/process_wrapper_pbtk.py,sha256=ycPmBRnv627RWks6N8OhxJQe8Gu3h3Vwj-4HswPOw0k,599
149
149
  atomicshop/wrappers/pyopensslw.py,sha256=OBWxA6EJ2vU_Qlf4M8m6ilcG3hyYB4yB0EsXUf7NhEU,6804
@@ -156,10 +156,10 @@ atomicshop/wrappers/dockerw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
156
156
  atomicshop/wrappers/dockerw/dockerw.py,sha256=w8zSJr5C7cbvbuG09ORCpAe0BOcibqqL_Z2EKEBHYK4,6266
157
157
  atomicshop/wrappers/dockerw/install_docker.py,sha256=eF0raR1EO9Xk1MVH7CvtkFI2Fgu9zL12MIYV_1vPTQk,4799
158
158
  atomicshop/wrappers/elasticsearchw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
159
- atomicshop/wrappers/elasticsearchw/config_basic.py,sha256=XJMKKfDrUq9ZKxYnQ-xFJxSA51z31Nn4eB8_n_hryVk,800
159
+ atomicshop/wrappers/elasticsearchw/config_basic.py,sha256=q9Ybr8TTeNPy6FxtiYCln8WNuwOQjdPazTRoGl7Lk8w,1066
160
160
  atomicshop/wrappers/elasticsearchw/elasticsearchw.py,sha256=7TqFdEFznO8NlligJhEKk1vm641ALpCYdaRl1uoXdzM,9768
161
- atomicshop/wrappers/elasticsearchw/infrastructure.py,sha256=J1hKIEQA8ImRUmkM25fbmwHbZPC9VnT9NK1_kOfXitA,8311
162
- atomicshop/wrappers/elasticsearchw/install_elastic.py,sha256=EeMZ2zSZIE3bvQ3HHJ4ed2TXLg1ufwKlDon79X5mhIU,8467
161
+ atomicshop/wrappers/elasticsearchw/infrastructure.py,sha256=Sy15gLVe_LAk9WpAoFxu5YApecFlYeJzzJ8lk5NYQEw,9217
162
+ atomicshop/wrappers/elasticsearchw/install_elastic.py,sha256=5CNgIoPIDnTCk5kU7Zcyb48TP4JScvUzeZmhcWt63sI,8754
163
163
  atomicshop/wrappers/elasticsearchw/queries/__init__.py,sha256=KBjT-bAt75CJsx1Apko9mpuFU4pfZV8DcGWQvpX65RU,78
164
164
  atomicshop/wrappers/elasticsearchw/queries/aggregation.py,sha256=N9a5yMMnb10sMa_x1qJBFQpgyJ49UWo8_vxuqmUtZ1A,1742
165
165
  atomicshop/wrappers/elasticsearchw/queries/info.py,sha256=P_VhhBo8MvRI4Shi-bh4RsYtlYNRKRBzScXPC64Up_Q,2900
@@ -199,7 +199,7 @@ atomicshop/wrappers/loggingw/loggers.py,sha256=DHOOTAtqkwn1xgvLHSkOiBm6yFGNuQy1k
199
199
  atomicshop/wrappers/loggingw/loggingw.py,sha256=v9WAseZXB50LluT9rIUcRvvevg2nLVKPgz3dbGejfV0,12151
200
200
  atomicshop/wrappers/loggingw/reading.py,sha256=xs7L6Jo-vedrhCVP7m-cJo0VhWmoSoK86avR4Tm0kG4,3675
201
201
  atomicshop/wrappers/nodejsw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
202
- atomicshop/wrappers/nodejsw/install_nodejs.py,sha256=an7zX_sEG4CF57tdeR3jldDSNnS8Z4vRfSY9y1OjF4g,1440
202
+ atomicshop/wrappers/nodejsw/install_nodejs.py,sha256=tHJQHpnK-QVrdbbUN3gz_6gklX5c6w1ERRgZ8efn4Bo,4794
203
203
  atomicshop/wrappers/playwrightw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
204
204
  atomicshop/wrappers/playwrightw/_tryouts.py,sha256=l1BLkFsiIMNlgv7nfZd1XGEvXQkIQkIcg48__9OaC00,4920
205
205
  atomicshop/wrappers/playwrightw/base.py,sha256=WeRpx8otdXuKSr-BjY-uCJTze21kbPpfitoOjKQz5-g,9818
@@ -232,8 +232,8 @@ atomicshop/wrappers/socketw/socket_server_tester.py,sha256=AhpurHJmP2kgzHaUbq5ey
232
232
  atomicshop/wrappers/socketw/socket_wrapper.py,sha256=aXBwlEIJhFT0-c4i8iNlFx2It9VpCEpsv--5Oqcpxao,11624
233
233
  atomicshop/wrappers/socketw/ssl_base.py,sha256=k4V3gwkbq10MvOH4btU4onLX2GNOsSfUAdcHmL1rpVE,2274
234
234
  atomicshop/wrappers/socketw/statistics_csv.py,sha256=t3dtDEfN47CfYVi0CW6Kc2QHTEeZVyYhc57IYYh5nmA,826
235
- atomicshop-2.9.33.dist-info/LICENSE.txt,sha256=lLU7EYycfYcK2NR_1gfnhnRC8b8ccOTElACYplgZN88,1094
236
- atomicshop-2.9.33.dist-info/METADATA,sha256=xhGDHuJiZxOFiXby5r0kKvwrMjy6bJN59Vx0ynMYkFU,10423
237
- atomicshop-2.9.33.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
238
- atomicshop-2.9.33.dist-info/top_level.txt,sha256=EgKJB-7xcrAPeqTRF2laD_Np2gNGYkJkd4OyXqpJphA,11
239
- atomicshop-2.9.33.dist-info/RECORD,,
235
+ atomicshop-2.10.0.dist-info/LICENSE.txt,sha256=lLU7EYycfYcK2NR_1gfnhnRC8b8ccOTElACYplgZN88,1094
236
+ atomicshop-2.10.0.dist-info/METADATA,sha256=FI-w5jz9h06C_vDlRS0qjGL9g7eA8xhcjhugwE74Da4,10423
237
+ atomicshop-2.10.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
238
+ atomicshop-2.10.0.dist-info/top_level.txt,sha256=EgKJB-7xcrAPeqTRF2laD_Np2gNGYkJkd4OyXqpJphA,11
239
+ atomicshop-2.10.0.dist-info/RECORD,,