pyinfra 2.9.2__py2.py3-none-any.whl → 3.0b1__py2.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.
Files changed (126) hide show
  1. pyinfra/api/__init__.py +3 -0
  2. pyinfra/api/arguments.py +261 -255
  3. pyinfra/api/arguments_typed.py +77 -0
  4. pyinfra/api/command.py +66 -53
  5. pyinfra/api/config.py +27 -22
  6. pyinfra/api/connect.py +1 -1
  7. pyinfra/api/connectors.py +2 -24
  8. pyinfra/api/deploy.py +21 -52
  9. pyinfra/api/exceptions.py +33 -8
  10. pyinfra/api/facts.py +77 -113
  11. pyinfra/api/host.py +150 -82
  12. pyinfra/api/inventory.py +17 -25
  13. pyinfra/api/operation.py +232 -198
  14. pyinfra/api/operations.py +102 -148
  15. pyinfra/api/state.py +137 -79
  16. pyinfra/api/util.py +55 -70
  17. pyinfra/connectors/base.py +150 -0
  18. pyinfra/connectors/chroot.py +160 -169
  19. pyinfra/connectors/docker.py +227 -237
  20. pyinfra/connectors/dockerssh.py +231 -253
  21. pyinfra/connectors/local.py +195 -207
  22. pyinfra/connectors/ssh.py +528 -615
  23. pyinfra/connectors/ssh_util.py +114 -0
  24. pyinfra/connectors/sshuserclient/client.py +5 -3
  25. pyinfra/connectors/terraform.py +86 -65
  26. pyinfra/connectors/util.py +212 -137
  27. pyinfra/connectors/vagrant.py +55 -48
  28. pyinfra/context.py +3 -2
  29. pyinfra/facts/docker.py +1 -0
  30. pyinfra/facts/files.py +45 -32
  31. pyinfra/facts/git.py +3 -1
  32. pyinfra/facts/gpg.py +1 -1
  33. pyinfra/facts/hardware.py +4 -2
  34. pyinfra/facts/iptables.py +5 -3
  35. pyinfra/facts/mysql.py +1 -0
  36. pyinfra/facts/postgres.py +168 -0
  37. pyinfra/facts/postgresql.py +5 -161
  38. pyinfra/facts/selinux.py +3 -1
  39. pyinfra/facts/server.py +77 -30
  40. pyinfra/facts/systemd.py +29 -12
  41. pyinfra/facts/sysvinit.py +10 -10
  42. pyinfra/facts/util/packaging.py +4 -2
  43. pyinfra/local.py +4 -5
  44. pyinfra/operations/apk.py +3 -3
  45. pyinfra/operations/apt.py +25 -47
  46. pyinfra/operations/brew.py +7 -14
  47. pyinfra/operations/bsdinit.py +4 -4
  48. pyinfra/operations/cargo.py +1 -1
  49. pyinfra/operations/choco.py +1 -1
  50. pyinfra/operations/dnf.py +4 -4
  51. pyinfra/operations/files.py +108 -321
  52. pyinfra/operations/gem.py +1 -1
  53. pyinfra/operations/git.py +6 -37
  54. pyinfra/operations/iptables.py +2 -10
  55. pyinfra/operations/launchd.py +1 -1
  56. pyinfra/operations/lxd.py +1 -9
  57. pyinfra/operations/mysql.py +5 -28
  58. pyinfra/operations/npm.py +1 -1
  59. pyinfra/operations/openrc.py +1 -1
  60. pyinfra/operations/pacman.py +3 -3
  61. pyinfra/operations/pip.py +14 -15
  62. pyinfra/operations/pkg.py +1 -1
  63. pyinfra/operations/pkgin.py +3 -3
  64. pyinfra/operations/postgres.py +347 -0
  65. pyinfra/operations/postgresql.py +17 -380
  66. pyinfra/operations/python.py +2 -17
  67. pyinfra/operations/selinux.py +5 -28
  68. pyinfra/operations/server.py +59 -84
  69. pyinfra/operations/snap.py +1 -3
  70. pyinfra/operations/ssh.py +8 -23
  71. pyinfra/operations/systemd.py +7 -7
  72. pyinfra/operations/sysvinit.py +3 -12
  73. pyinfra/operations/upstart.py +4 -4
  74. pyinfra/operations/util/__init__.py +12 -0
  75. pyinfra/operations/util/files.py +2 -2
  76. pyinfra/operations/util/packaging.py +6 -24
  77. pyinfra/operations/util/service.py +18 -37
  78. pyinfra/operations/vzctl.py +2 -2
  79. pyinfra/operations/xbps.py +3 -3
  80. pyinfra/operations/yum.py +4 -4
  81. pyinfra/operations/zypper.py +4 -4
  82. {pyinfra-2.9.2.dist-info → pyinfra-3.0b1.dist-info}/METADATA +19 -22
  83. pyinfra-3.0b1.dist-info/RECORD +163 -0
  84. pyinfra-3.0b1.dist-info/entry_points.txt +11 -0
  85. pyinfra_cli/__main__.py +2 -0
  86. pyinfra_cli/commands.py +7 -2
  87. pyinfra_cli/exceptions.py +83 -42
  88. pyinfra_cli/inventory.py +19 -4
  89. pyinfra_cli/log.py +17 -3
  90. pyinfra_cli/main.py +133 -90
  91. pyinfra_cli/prints.py +93 -129
  92. pyinfra_cli/util.py +60 -29
  93. tests/test_api/test_api.py +2 -0
  94. tests/test_api/test_api_arguments.py +13 -13
  95. tests/test_api/test_api_deploys.py +28 -29
  96. tests/test_api/test_api_facts.py +60 -98
  97. tests/test_api/test_api_operations.py +100 -200
  98. tests/test_cli/test_cli.py +18 -49
  99. tests/test_cli/test_cli_deploy.py +11 -37
  100. tests/test_cli/test_cli_exceptions.py +50 -19
  101. tests/test_cli/util.py +1 -1
  102. tests/test_connectors/test_chroot.py +6 -6
  103. tests/test_connectors/test_docker.py +4 -4
  104. tests/test_connectors/test_dockerssh.py +38 -50
  105. tests/test_connectors/test_local.py +11 -12
  106. tests/test_connectors/test_ssh.py +66 -107
  107. tests/test_connectors/test_terraform.py +9 -15
  108. tests/test_connectors/test_util.py +24 -46
  109. tests/test_connectors/test_vagrant.py +4 -4
  110. pyinfra/api/operation.pyi +0 -117
  111. pyinfra/connectors/ansible.py +0 -171
  112. pyinfra/connectors/mech.py +0 -186
  113. pyinfra/connectors/pyinfrawinrmsession/__init__.py +0 -28
  114. pyinfra/connectors/winrm.py +0 -320
  115. pyinfra/facts/windows.py +0 -366
  116. pyinfra/facts/windows_files.py +0 -90
  117. pyinfra/operations/windows.py +0 -59
  118. pyinfra/operations/windows_files.py +0 -551
  119. pyinfra-2.9.2.dist-info/RECORD +0 -170
  120. pyinfra-2.9.2.dist-info/entry_points.txt +0 -14
  121. tests/test_connectors/test_ansible.py +0 -64
  122. tests/test_connectors/test_mech.py +0 -126
  123. tests/test_connectors/test_winrm.py +0 -76
  124. {pyinfra-2.9.2.dist-info → pyinfra-3.0b1.dist-info}/LICENSE.md +0 -0
  125. {pyinfra-2.9.2.dist-info → pyinfra-3.0b1.dist-info}/WHEEL +0 -0
  126. {pyinfra-2.9.2.dist-info → pyinfra-3.0b1.dist-info}/top_level.txt +0 -0
@@ -12,7 +12,7 @@ from . import files
12
12
  from .util.service import handle_service_control
13
13
 
14
14
 
15
- @operation
15
+ @operation()
16
16
  def service(
17
17
  service,
18
18
  running=True,
@@ -75,34 +75,25 @@ def service(
75
75
  # If no links exist, attempt to enable the service using distro-specific commands
76
76
  if enabled is True and not start_links:
77
77
  distro = host.get_fact(LinuxDistribution).get("name")
78
- did_add = False
79
78
 
80
79
  if distro in ("Ubuntu", "Debian"):
81
80
  yield "update-rc.d {0} defaults".format(service)
82
- did_add = True
83
81
 
84
82
  elif distro in ("CentOS", "Fedora", "Red Hat Enterprise Linux"):
85
83
  yield "chkconfig {0} --add".format(service)
86
84
  yield "chkconfig {0} on".format(service)
87
- did_add = True
88
85
 
89
86
  elif distro == "Gentoo":
90
87
  yield "rc-update add {0} default".format(service)
91
- did_add = True
92
-
93
- # Add a single start link to the fact if we executed a command
94
- if did_add:
95
- start_links.append("/etc/rc0.d/S20{0}".format(service))
96
88
 
97
89
  # Remove any /etc/rcX.d/<service> start links
98
90
  elif enabled is False:
99
91
  # No state checking, just blindly remove any that exist
100
92
  for link in start_links:
101
93
  yield "rm -f {0}".format(link)
102
- start_links.remove(link)
103
94
 
104
95
 
105
- @operation
96
+ @operation()
106
97
  def enable(
107
98
  service,
108
99
  start_priority=20,
@@ -142,7 +133,7 @@ def enable(
142
133
 
143
134
  # Ensure all the new links exist
144
135
  for link in links:
145
- yield from files.link(
136
+ yield from files.link._inner(
146
137
  path=link,
147
138
  target="/etc/init.d/{0}".format(service),
148
139
  )
@@ -12,7 +12,7 @@ from . import files
12
12
  from .util.service import handle_service_control
13
13
 
14
14
 
15
- @operation
15
+ @operation()
16
16
  def service(
17
17
  service,
18
18
  running=True,
@@ -52,15 +52,15 @@ def service(
52
52
  # Upstart jobs are setup w/runlevels etc in their config files, so here we just check
53
53
  # there's no override file.
54
54
  if enabled is True:
55
- yield from files.file(
56
- "/etc/init/{0}.override".format(service),
55
+ yield from files.file._inner(
56
+ path="/etc/init/{0}.override".format(service),
57
57
  present=False,
58
58
  )
59
59
 
60
60
  # Set the override file to "manual" to disable automatic start
61
61
  elif enabled is False:
62
62
  file = StringIO("manual\n")
63
- yield from files.put(
63
+ yield from files.put._inner(
64
64
  src=file,
65
65
  dest="/etc/init/{0}.override".format(service),
66
66
  )
@@ -0,0 +1,12 @@
1
+ from typing import TYPE_CHECKING, Callable
2
+
3
+ if TYPE_CHECKING:
4
+ from pyinfra.api.operation import OperationMeta
5
+
6
+
7
+ def any_changed(*args: "OperationMeta") -> Callable[[], bool]:
8
+ return lambda: any((meta.did_change() for meta in args))
9
+
10
+
11
+ def all_changed(*args: "OperationMeta") -> Callable[[], bool]:
12
+ return lambda: all((meta.did_change() for meta in args))
@@ -4,8 +4,8 @@ from datetime import datetime
4
4
  from pyinfra.api import QuoteString, StringCommand
5
5
 
6
6
 
7
- def unix_path_join(*parts):
8
- parts = list(parts)
7
+ def unix_path_join(*path_parts):
8
+ parts = list(path_parts)
9
9
  parts[0:-1] = [part.rstrip("/") for part in parts[0:-1]]
10
10
  return "/".join(parts)
11
11
 
@@ -149,20 +149,6 @@ def ensure_packages(
149
149
  " ".join([shlex.quote(pkg) for pkg in joined_packages]),
150
150
  )
151
151
 
152
- for package in diff_packages: # add/remove from current packages
153
- pkg_name = _package_name(package)
154
- version = "unknown"
155
- if isinstance(package, list):
156
- version = package[1]
157
-
158
- if present:
159
- current_packages[pkg_name] = [version]
160
- current_packages.update(diff_expanded_packages.get(pkg_name, {}))
161
- else:
162
- current_packages.pop(pkg_name, None)
163
- for name in diff_expanded_packages.get(pkg_name, {}):
164
- current_packages.pop(name, None)
165
-
166
152
  if latest and upgrade_command and upgrade_packages:
167
153
  yield "{0} {1}".format(
168
154
  upgrade_command,
@@ -176,10 +162,10 @@ def ensure_rpm(state, host, files, source, present, package_manager_command):
176
162
  # If source is a url
177
163
  if urlparse(source).scheme:
178
164
  # Generate a temp filename (with .rpm extension to please yum)
179
- temp_filename = "{0}.rpm".format(state.get_temp_filename(source))
165
+ temp_filename = "{0}.rpm".format(host.get_temp_filename(source))
180
166
 
181
167
  # Ensure it's downloaded
182
- yield from files.download(source, temp_filename)
168
+ yield from files.download._inner(source, temp_filename)
183
169
 
184
170
  # Override the source with the downloaded file
185
171
  source = temp_filename
@@ -199,8 +185,6 @@ def ensure_rpm(state, host, files, source, present, package_manager_command):
199
185
  # If we had info, always install
200
186
  if info:
201
187
  yield "rpm -i {0}".format(source)
202
- host.create_fact(RpmPackage, kwargs={"name": info["name"]}, data=info)
203
-
204
188
  # This happens if we download the package mid-deploy, so we have no info
205
189
  # but also don't know if it's installed. So check at runtime, otherwise
206
190
  # the install will fail.
@@ -210,8 +194,6 @@ def ensure_rpm(state, host, files, source, present, package_manager_command):
210
194
  # Package exists but we don't want?
211
195
  elif exists and not present:
212
196
  yield "{0} remove -y {1}".format(package_manager_command, info["name"])
213
- host.delete_fact(RpmPackage, kwargs={"name": info["name"]})
214
-
215
197
  else:
216
198
  host.noop(
217
199
  "rpm {0} is {1}".format(
@@ -247,13 +229,13 @@ def ensure_yum_repo(
247
229
 
248
230
  # If we don't want the repo, just remove any existing file
249
231
  if not present:
250
- yield from files.file(filename, present=False)
232
+ yield from files.file._inner(filename, present=False)
251
233
  return
252
234
 
253
235
  # If we're a URL, download the repo if it doesn't exist
254
236
  if url:
255
237
  if not host.get_fact(File, path=filename):
256
- yield from files.download(url, filename)
238
+ yield from files.download._inner(url, filename)
257
239
  return
258
240
 
259
241
  # Description defaults to name
@@ -276,7 +258,7 @@ def ensure_yum_repo(
276
258
 
277
259
  repo_lines.append("")
278
260
  repo = "\n".join(repo_lines)
279
- repo = StringIO(repo)
261
+ repo_file = StringIO(repo)
280
262
 
281
263
  # Ensure this is the file on the server
282
- yield from files.put(repo, filename)
264
+ yield from files.put._inner(repo_file, filename)
@@ -11,46 +11,27 @@ def handle_service_control(
11
11
  ):
12
12
  status = statuses.get(name, None)
13
13
 
14
- # If we don't know the status, we need to check if it's up before starting
15
- # and/or restarting/reloading
16
- if status is None:
17
- yield (
18
- "if ({status_command}); then "
19
- "({stop_command}); ({restart_command}); ({reload_command}); "
20
- "else ({start_command}); fi"
21
- ).format(
22
- status_command=formatter.format(name, status_argument),
23
- start_command=(formatter.format(name, "start") if running is True else "true"),
24
- stop_command=(formatter.format(name, "stop") if running is False else "true"),
25
- restart_command=(formatter.format(name, "restart") if restarted else "true"),
26
- reload_command=(formatter.format(name, "reload") if reloaded else "true"),
27
- )
28
- statuses[name] = running
14
+ # Need down but running
15
+ if running is False:
16
+ if status:
17
+ yield formatter.format(name, "stop")
18
+ else:
19
+ host.noop("service {0} is stopped".format(name))
29
20
 
30
- else:
31
- # Need down but running
32
- if running is False:
33
- if status:
34
- yield formatter.format(name, "stop")
35
- statuses[name] = False
36
- else:
37
- host.noop("service {0} is stopped".format(name))
21
+ # Need running but down
22
+ if running is True:
23
+ if not status:
24
+ yield formatter.format(name, "start")
25
+ else:
26
+ host.noop("service {0} is running".format(name))
38
27
 
39
- # Need running but down
40
- if running is True:
41
- if not status:
42
- yield formatter.format(name, "start")
43
- statuses[name] = True
44
- else:
45
- host.noop("service {0} is running".format(name))
28
+ # Only restart if the service is already running
29
+ if restarted and status:
30
+ yield formatter.format(name, "restart")
46
31
 
47
- # Only restart if the service is already running
48
- if restarted and status:
49
- yield formatter.format(name, "restart")
50
-
51
- # Only reload if the service is already reloaded
52
- if reloaded and status:
53
- yield formatter.format(name, "reload")
32
+ # Only reload if the service is already reloaded
33
+ if reloaded and status:
34
+ yield formatter.format(name, "reload")
54
35
 
55
36
  # Always execute arbitrary commands as these may or may not rely on the service
56
37
  # being up or down
@@ -46,8 +46,8 @@ def restart(ctid, force=False):
46
46
  + force: whether to force container start
47
47
  """
48
48
 
49
- yield from stop(ctid)
50
- yield from start(ctid, force=force)
49
+ yield from stop._inner(ctid)
50
+ yield from start._inner(ctid, force=force)
51
51
 
52
52
 
53
53
  @operation(is_idempotent=False)
@@ -18,7 +18,7 @@ def upgrade():
18
18
  yield "xbps-install -y -u"
19
19
 
20
20
 
21
- _upgrade = upgrade # noqa: E305
21
+ _upgrade = upgrade._inner # noqa: E305
22
22
 
23
23
 
24
24
  @operation(is_idempotent=False)
@@ -30,10 +30,10 @@ def update():
30
30
  yield "xbps-install -S"
31
31
 
32
32
 
33
- _update = update # noqa: E305
33
+ _update = update._inner # noqa: E305
34
34
 
35
35
 
36
- @operation
36
+ @operation()
37
37
  def packages(
38
38
  packages=None,
39
39
  present=True,
pyinfra/operations/yum.py CHANGED
@@ -35,7 +35,7 @@ def key(src):
35
35
  yield "rpm --import {0}".format(src)
36
36
 
37
37
 
38
- @operation
38
+ @operation()
39
39
  def repo(
40
40
  src,
41
41
  present=True,
@@ -94,7 +94,7 @@ def repo(
94
94
  )
95
95
 
96
96
 
97
- @operation
97
+ @operation()
98
98
  def rpm(src, present=True):
99
99
  # NOTE: if updating this docstring also update `dnf.rpm`
100
100
  """
@@ -130,10 +130,10 @@ def update():
130
130
  yield "yum update -y"
131
131
 
132
132
 
133
- _update = update # noqa: E305 (for use below where update is a kwarg)
133
+ _update = update._inner # noqa: E305 (for use below where update is a kwarg)
134
134
 
135
135
 
136
- @operation
136
+ @operation()
137
137
  def packages(
138
138
  packages=None,
139
139
  present=True,
@@ -9,7 +9,7 @@ from .yum import key as yum_key
9
9
  key = yum_key
10
10
 
11
11
 
12
- @operation
12
+ @operation()
13
13
  def repo(
14
14
  src,
15
15
  baseurl=None,
@@ -71,7 +71,7 @@ def repo(
71
71
  )
72
72
 
73
73
 
74
- @operation
74
+ @operation()
75
75
  def rpm(src, present=True):
76
76
  # NOTE: if updating this docstring also update `dnf.rpm`
77
77
  """
@@ -106,10 +106,10 @@ def update():
106
106
  yield "zypper update -y"
107
107
 
108
108
 
109
- _update = update # noqa: E305 (for use below where update is a kwarg)
109
+ _update = update._inner # noqa: E305 (for use below where update is a kwarg)
110
110
 
111
111
 
112
- @operation
112
+ @operation()
113
113
  def packages(
114
114
  packages=None,
115
115
  present=True,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyinfra
3
- Version: 2.9.2
3
+ Version: 3.0b1
4
4
  Summary: pyinfra automates/provisions/manages/deploys infrastructure.
5
5
  Home-page: https://pyinfra.com
6
6
  Author: Nick / Fizzadar
@@ -16,7 +16,6 @@ Classifier: Intended Audience :: Information Technology
16
16
  Classifier: License :: OSI Approved :: MIT License
17
17
  Classifier: Operating System :: OS Independent
18
18
  Classifier: Programming Language :: Python :: 3
19
- Classifier: Programming Language :: Python :: 3.6
20
19
  Classifier: Programming Language :: Python :: 3.7
21
20
  Classifier: Programming Language :: Python :: 3.8
22
21
  Classifier: Programming Language :: Python :: 3.9
@@ -34,25 +33,26 @@ Requires-Dist: python-dateutil <3,>2
34
33
  Requires-Dist: setuptools
35
34
  Requires-Dist: configparser
36
35
  Requires-Dist: pywinrm
36
+ Requires-Dist: typeguard
37
37
  Requires-Dist: distro <2,>=1.6
38
+ Requires-Dist: typing-extensions ; python_version < "3.11"
38
39
  Requires-Dist: graphlib-backport ; python_version < "3.9"
39
- Provides-Extra: ansible
40
- Requires-Dist: pyyaml ; extra == 'ansible'
41
40
  Provides-Extra: dev
42
- Requires-Dist: pyyaml ; extra == 'dev'
41
+ Requires-Dist: pytest ==7.2.0 ; extra == 'dev'
42
+ Requires-Dist: coverage ==6.5 ; extra == 'dev'
43
43
  Requires-Dist: pytest-cov ==4.0.0 ; extra == 'dev'
44
44
  Requires-Dist: black ==22.3.0 ; extra == 'dev'
45
45
  Requires-Dist: isort ==5.10.1 ; extra == 'dev'
46
46
  Requires-Dist: flake8 ==4.0.1 ; extra == 'dev'
47
47
  Requires-Dist: flake8-black ==0.3.0 ; extra == 'dev'
48
48
  Requires-Dist: flake8-isort ==4.1.1 ; extra == 'dev'
49
- Requires-Dist: mypy ==0.971 ; extra == 'dev'
49
+ Requires-Dist: mypy ; extra == 'dev'
50
50
  Requires-Dist: types-cryptography ; extra == 'dev'
51
51
  Requires-Dist: types-paramiko ; extra == 'dev'
52
52
  Requires-Dist: types-python-dateutil ; extra == 'dev'
53
53
  Requires-Dist: types-PyYAML ; extra == 'dev'
54
54
  Requires-Dist: types-setuptools ; extra == 'dev'
55
- Requires-Dist: pyinfra-guzzle-sphinx-theme ==0.14 ; extra == 'dev'
55
+ Requires-Dist: pyinfra-guzzle-sphinx-theme ==0.15 ; extra == 'dev'
56
56
  Requires-Dist: myst-parser ==2.0.0 ; extra == 'dev'
57
57
  Requires-Dist: sphinx ==6.2.1 ; extra == 'dev'
58
58
  Requires-Dist: wheel ; extra == 'dev'
@@ -62,32 +62,25 @@ Requires-Dist: ipdb ; extra == 'dev'
62
62
  Requires-Dist: ipdbplugin ; extra == 'dev'
63
63
  Requires-Dist: flake8-spellcheck ==0.12.1 ; extra == 'dev'
64
64
  Requires-Dist: redbaron ; extra == 'dev'
65
- Requires-Dist: pytest ==7.0.1 ; (python_version <= "3.6") and extra == 'dev'
66
- Requires-Dist: coverage ==6.2 ; (python_version <= "3.6") and extra == 'dev'
67
- Requires-Dist: pytest ==7.2.0 ; (python_version > "3.6") and extra == 'dev'
68
- Requires-Dist: coverage ==6.5 ; (python_version > "3.6") and extra == 'dev'
69
65
  Provides-Extra: docs
70
- Requires-Dist: pyinfra-guzzle-sphinx-theme ==0.14 ; extra == 'docs'
66
+ Requires-Dist: pyinfra-guzzle-sphinx-theme ==0.15 ; extra == 'docs'
71
67
  Requires-Dist: myst-parser ==2.0.0 ; extra == 'docs'
72
68
  Requires-Dist: sphinx ==6.2.1 ; extra == 'docs'
73
69
  Provides-Extra: test
74
- Requires-Dist: pyyaml ; extra == 'test'
70
+ Requires-Dist: pytest ==7.2.0 ; extra == 'test'
71
+ Requires-Dist: coverage ==6.5 ; extra == 'test'
75
72
  Requires-Dist: pytest-cov ==4.0.0 ; extra == 'test'
76
73
  Requires-Dist: black ==22.3.0 ; extra == 'test'
77
74
  Requires-Dist: isort ==5.10.1 ; extra == 'test'
78
75
  Requires-Dist: flake8 ==4.0.1 ; extra == 'test'
79
76
  Requires-Dist: flake8-black ==0.3.0 ; extra == 'test'
80
77
  Requires-Dist: flake8-isort ==4.1.1 ; extra == 'test'
81
- Requires-Dist: mypy ==0.971 ; extra == 'test'
78
+ Requires-Dist: mypy ; extra == 'test'
82
79
  Requires-Dist: types-cryptography ; extra == 'test'
83
80
  Requires-Dist: types-paramiko ; extra == 'test'
84
81
  Requires-Dist: types-python-dateutil ; extra == 'test'
85
82
  Requires-Dist: types-PyYAML ; extra == 'test'
86
83
  Requires-Dist: types-setuptools ; extra == 'test'
87
- Requires-Dist: pytest ==7.0.1 ; (python_version <= "3.6") and extra == 'test'
88
- Requires-Dist: coverage ==6.2 ; (python_version <= "3.6") and extra == 'test'
89
- Requires-Dist: pytest ==7.2.0 ; (python_version > "3.6") and extra == 'test'
90
- Requires-Dist: coverage ==6.5 ; (python_version > "3.6") and extra == 'test'
91
84
 
92
85
  <p align="center">
93
86
  <a href="https://pyinfra.com">
@@ -95,13 +88,17 @@ Requires-Dist: coverage ==6.5 ; (python_version > "3.6") and extra == 'test'
95
88
  </a>
96
89
  </p>
97
90
 
98
- <p align="center">
99
- <em>pyinfra automates infrastructure using Python. It’s fast and scales from one server to thousands. Great for ad-hoc command execution, service deployment, configuration management and more.</em>
91
+ <p>
92
+ <strong>Note: this is the v3 branch, which is currently in beta. <a href="https://docs.pyinfra.com/en/next">See the docs for v3</a>. If needed the <a href="https://github.com/pyinfra-dev/pyinfra/tree/2.x/">2.x branch is here</a>, but is in bugfix only mode.</strong>
93
+ </p>
94
+
95
+ <p>
96
+ pyinfra turns Python code into shell commands and runs them on your servers. Execute ad-hoc commands and write declarative operations. Target SSH servers, local machine and Docker containers. Fast and scales from one server to thousands. Think <code>ansible</code> but Python instead of YAML, and a lot faster.
100
97
  </p>
101
98
 
102
99
  ---
103
100
 
104
- <p align="center">
101
+ <p>
105
102
  <a href="https://docs.pyinfra.com"><strong>Documentation</strong></a> &rArr;
106
103
  <a href="https://docs.pyinfra.com/page/getting-started.html"><strong>Getting Started</strong></a> &bull;
107
104
  <a href="https://docs.pyinfra.com/page/examples.html"><strong>Examples</strong></a> &bull;
@@ -109,7 +106,7 @@ Requires-Dist: coverage ==6.5 ; (python_version > "3.6") and extra == 'test'
109
106
  <a href="https://docs.pyinfra.com/page/contributing.html"><strong>Contributing</strong></a>
110
107
  </p>
111
108
 
112
- <p align="center">
109
+ <p>
113
110
  Chat &rArr;
114
111
  <a href="https://matrix.to/#/#pyinfra:matrix.org"><strong><code>#pyinfra</code> on Matrix</strong></a>
115
112
  </p>
@@ -0,0 +1,163 @@
1
+ pyinfra/__init__.py,sha256=7ZcKHGWk7_nYxsYrbFBB_vJr-J-Ddbc56ZS4sk5ArVw,535
2
+ pyinfra/__main__.py,sha256=aVd00glLz5CMJGXgt1XxbOvC2HluqaowoTOjxgIpBaA,47
3
+ pyinfra/context.py,sha256=4oPK1wsLL4aG5CJtt7Ufe_4D3knrBeZaeZWlU979JNg,3394
4
+ pyinfra/local.py,sha256=0bpIRCyDKM6i_jA1i8Ej2qr_iWIF9cUYWutXNdLj8po,2751
5
+ pyinfra/progress.py,sha256=X3hXZ4Flh_L9FE4ZEWxWoG0R4dA5UPd1FCO-Exd5Xtc,4193
6
+ pyinfra/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ pyinfra/version.py,sha256=hAgEPHVJVjA2I-rI0gy038UAPVKcmulk-3dZLOmkYrI,153
8
+ pyinfra/api/__init__.py,sha256=suGbKKM-qCduuXFYBEcyswlTqozewtYpdLRhK63PVn0,942
9
+ pyinfra/api/arguments.py,sha256=1kTpgvCeKpMnmf7IhIfARjEjz0-94L7ud1qP90JSeAU,9748
10
+ pyinfra/api/arguments_typed.py,sha256=fy_Sg3UgzYmm7rG8Vvheu_Ah-YjpfpIkBIRDFUbYhaY,2254
11
+ pyinfra/api/command.py,sha256=KGhAnaxZGZv5NJa0-aOgu2g9nOYTsdjlCaFHR6QO53E,7176
12
+ pyinfra/api/config.py,sha256=G1ZNHw26G1QyqEBU6AuFsK3jVKdgW-VPqE9WZgtlzkg,4221
13
+ pyinfra/api/connect.py,sha256=Z9wusMLR_jBkKKk5D4AUOj8LHl3H5MsNO5FxAeR4jac,1416
14
+ pyinfra/api/connectors.py,sha256=SLmKtoN4cXvcQz9IgWSPI-d3ZMzJ09pcvka42Fiuo7s,544
15
+ pyinfra/api/deploy.py,sha256=xo4F7URUf3xzIChRHZn4zwqs_WTjLjZNC9i9eQjAFk8,2756
16
+ pyinfra/api/exceptions.py,sha256=cCbUp1qN1QO0d9aAvOAbRgYpLi0vUI5j7ZqSjcD1_P8,1861
17
+ pyinfra/api/facts.py,sha256=FOIn6qO2tw5I1hkS0fAaBmhGfnMwKWZjn1ZqCnU6_pA,10282
18
+ pyinfra/api/host.py,sha256=CzTDyYROIZqDSCVTrlIOoX1ODqLMNlW08W1nN9oH-Rs,13475
19
+ pyinfra/api/inventory.py,sha256=83ttxbGbIwN2tvmVTW68fumIDXNMk48qvL0NxwGPkNs,7663
20
+ pyinfra/api/operation.py,sha256=2r3RylueNAjDL0SwCIln84Jpwl2KA3Xep2rtwGQXX3I,14789
21
+ pyinfra/api/operations.py,sha256=jvz9ISfwmQnAQVUKLnbrRdD9QHIAAfypo9l5b3fYG1w,10894
22
+ pyinfra/api/state.py,sha256=3dXRjeZJXnzLcbP9E4aogkRPwIg3_kK1h4Tf4FVZock,12622
23
+ pyinfra/api/util.py,sha256=TkUlcMPIrLGxRQY19CvCXL1H_20DjFTmFL0QbFqQ0gw,11977
24
+ pyinfra/connectors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
+ pyinfra/connectors/base.py,sha256=41RSf0t6LlYZe3nW9B1CfbOwbOulaDnZT3fnGn23DWw,3756
26
+ pyinfra/connectors/chroot.py,sha256=Xd72I8T58KIwKOoc0LXCw91AoEIaiHfRLDcDVTHGJ0o,5931
27
+ pyinfra/connectors/docker.py,sha256=NRqE8543j0eqUnjv2wbokW-hWkam2kZNiokPTGYDBXI,8964
28
+ pyinfra/connectors/dockerssh.py,sha256=VWHY--jqs3yf-RuPUZXav4vLeON9SzoVC9CUyOJo1rg,8919
29
+ pyinfra/connectors/local.py,sha256=szFO9VP5xNWpqK9ThkjroyFvnxckiG5kjM08vgqbVhc,6929
30
+ pyinfra/connectors/ssh.py,sha256=w3UTuZOeO9fFwcvQWZ7xS8KyCvsWWd4uKJc_6ONSMrU,21018
31
+ pyinfra/connectors/ssh_util.py,sha256=CN_5AdTA3RpiWCnXTrRBjez1NsN59hITDzQmXIkZvoE,3683
32
+ pyinfra/connectors/terraform.py,sha256=G7lK168Fz0jNFetc_7_bPT-RnoaRDksJat0R26fqkUk,3617
33
+ pyinfra/connectors/util.py,sha256=JBGTgBkXQTu7l5uVYPzVfQdPXwehmRWkMf8IEVj2gGs,11326
34
+ pyinfra/connectors/vagrant.py,sha256=6edwwc5rMfEFridUN9BXytoIeXeBQvyoucLcSUTGivs,4722
35
+ pyinfra/connectors/sshuserclient/__init__.py,sha256=Qc4RO2wknSWIiNTwOeQ0y2TeiuKHmyWDW2Dz4MOo9CE,44
36
+ pyinfra/connectors/sshuserclient/client.py,sha256=7YSd3QckZuPDRnKzy2FfG3J8zp7CY-jny8tbWwxvKro,9720
37
+ pyinfra/connectors/sshuserclient/config.py,sha256=UMwkvTgAIS7__re6Wz_pwH6EU4kO1-uMQ5zuFakH0v4,2721
38
+ pyinfra/facts/__init__.py,sha256=myTXSOZmAqmU88Fyifn035h9Lr6Gj2mlka_jDcXyKGw,347
39
+ pyinfra/facts/apk.py,sha256=2-Hz4I_7iLU06Y0T9_JX5Fo3k_FZpgKNGZ_I5KQGTto,482
40
+ pyinfra/facts/apt.py,sha256=zqFSPIAaIgHWWg3eGgL-BDX1aqvgiQ7rNc8QrE1LXLg,1999
41
+ pyinfra/facts/brew.py,sha256=POnOx3PWzK1B8pbtkI9wBmYSUsG0IblpwrMHZsMC7Og,2266
42
+ pyinfra/facts/bsdinit.py,sha256=sx54RAmS7rjTDzLbUWv86UFtfE8H56qokektf5smN30,490
43
+ pyinfra/facts/cargo.py,sha256=C_2NIWcDzT5Y6xxnT5TvuhWpLJCQTqVVXK8biiUvhjI,531
44
+ pyinfra/facts/choco.py,sha256=gYdgqglICBn6SStyJvHwQGD8ayo0Zwp5EMiNuYRs5VY,703
45
+ pyinfra/facts/deb.py,sha256=v2wSbOIFefY7QrQbXZ584mH_bDW9kzUqozCvZ_5dEgE,1666
46
+ pyinfra/facts/dnf.py,sha256=zV_Fx4cq81lyKctDYki65e088kXDAyZiwkEcBDOoLtU,862
47
+ pyinfra/facts/docker.py,sha256=0EUskxna88haXeHYJBFUDnUHJcX2QIwwKME_dRcfoiY,1678
48
+ pyinfra/facts/files.py,sha256=VJujyRa9FiowXnNJUuDmYk6hJi8DYJYetvOAnatkpcg,11475
49
+ pyinfra/facts/gem.py,sha256=bUl8PcXHb5wIw3O4E9YAc0cPzCZQK1IbV_4f3hZht6s,473
50
+ pyinfra/facts/git.py,sha256=rk4NS2SQJiosI6eY2eCy_p9kOP4O8UARRjFi16ObE2w,1294
51
+ pyinfra/facts/gpg.py,sha256=OCfXW-JQpjyn7jLrluEXjpu9Wr_DE_6eWEsyKVLOnNU,3729
52
+ pyinfra/facts/hardware.py,sha256=rEwe5nK6m_c3zLsEpU0x0qSkGCZfKrBlUVhhjAT2Bbo,11402
53
+ pyinfra/facts/iptables.py,sha256=sUkywfHZUXnMZF_KshAnyJufrJvZ9fBYnERSRbwOCRE,3374
54
+ pyinfra/facts/launchd.py,sha256=NtsaAJh0rncopvuawqqv36kOdFsUdpiYS7e5yCGoXeA,668
55
+ pyinfra/facts/lxd.py,sha256=uYmqu8vSzfhM0Ymm15pT4IhI4UbRayC23GM6kSYN1mw,337
56
+ pyinfra/facts/mysql.py,sha256=o5qvcxKjW2zXNSr4tLZa1IaNEUz0TVLWy7T9uLlxTm8,5896
57
+ pyinfra/facts/npm.py,sha256=c_bU5BoeOfBfZd_qyz2K1ZzzlH_k1VSzjuOiGqC4H8o,674
58
+ pyinfra/facts/openrc.py,sha256=IluFop9jskxHnWRJkKlGZZV7nQDOFzhiAMAH0ThyiLo,1350
59
+ pyinfra/facts/pacman.py,sha256=SJTdi49nBHk7Gb6ajf2I5PZTHWkqZ_k4npAf695luRs,1001
60
+ pyinfra/facts/pip.py,sha256=v6pJCQHOB8DaDgpyrLTz3kKKCSqvLG_zs0uy6_gGOf8,702
61
+ pyinfra/facts/pkg.py,sha256=GgRU5x9OWfAfqF-KgJiJz0ndtLKhiRGhtTG4agfunuM,452
62
+ pyinfra/facts/pkgin.py,sha256=_rekZJtKLx2TOHd_REJLMDp02typZMpQkZ7sC4FLJSQ,481
63
+ pyinfra/facts/postgres.py,sha256=ncx16P6UDZBuOw_7TG_t4AMLSKiI2Xu2nEBPLZ4HZ6Y,4094
64
+ pyinfra/facts/postgresql.py,sha256=nWXwIFFYnF7vGj-yGmhtI2OAQEvlnpIAs-WupUja9vI,187
65
+ pyinfra/facts/rpm.py,sha256=CdC-r2_cfbt81z3sjAE4I-ne46jI-Of6uyDSvELVJfk,1973
66
+ pyinfra/facts/selinux.py,sha256=N0zbJrAtBeRBtxZFUHbYTLQ2L4mRV7_Oj3Cj3OA1Npw,4272
67
+ pyinfra/facts/server.py,sha256=gxEW1By_mi9BVZcAQZC5o1Sz0pxQdPVzoQRXV7WxM5w,19794
68
+ pyinfra/facts/snap.py,sha256=9PYA73ASi-FgBk_y42lGJyETqEgfcJGm-6EFeKzayhE,1910
69
+ pyinfra/facts/systemd.py,sha256=jhTIMcN96lJbV03xrEjB_0YLg1BxKTFfq5KcpNXtH9Y,3927
70
+ pyinfra/facts/sysvinit.py,sha256=PS7yMOrVxclywKjF3BIXmxTBgn2_vpSTQrDeOly_j8Q,1490
71
+ pyinfra/facts/upstart.py,sha256=9mqTYsUpDs7gC5Rest2sQS3EohGXAPjEQUINJWELkW0,543
72
+ pyinfra/facts/vzctl.py,sha256=AnRl6SZ7HxMGOVl021v0P37pN4tujbwLFuvxUMOCW_M,591
73
+ pyinfra/facts/xbps.py,sha256=HBvQ7hvvzC8-Bi952s56Sn4edlOKVITuATpE2sqEPqY,481
74
+ pyinfra/facts/yum.py,sha256=h255QEH8VcQTCVdkjwikyk-Pxqzh-dl3Og6a0nMmyVE,827
75
+ pyinfra/facts/zypper.py,sha256=O3qoRRh6F6NUP1kEJQ3hE_VJ6C5E8wHPIqZnBthsQcM,766
76
+ pyinfra/facts/util/__init__.py,sha256=f7HKu8z9_yFC899ajJ3RFiyivioaZeGfOI6nf9GviCs,521
77
+ pyinfra/facts/util/databases.py,sha256=EphGQApzRBXI2nG1FL9h8bozY-o4SgdQgpv9YcnCkxs,730
78
+ pyinfra/facts/util/packaging.py,sha256=KF1geTb-C9zs_O1oUfAKpdJCktQJCbvChjeLg6yXzFc,1090
79
+ pyinfra/facts/util/win_files.py,sha256=S_IQ5kJD6ZgkEcVHajgh7BIMolLV-1q1ghIcwAS-E1Q,2561
80
+ pyinfra/operations/__init__.py,sha256=SOcW337KXIzD_LH-iJJfq14BQcCs5JzwswJ0PIzDgF4,357
81
+ pyinfra/operations/apk.py,sha256=WEyNHQ1uU-DgtV4xUbPFCLA5ID4JE22d2gHZvrnJrYY,2049
82
+ pyinfra/operations/apt.py,sha256=8wv1otDMW3DAWY-Ox6IRIvPKdLLpQJnb0EN8eFhxXi0,13526
83
+ pyinfra/operations/brew.py,sha256=aE-t72NdDHssjvabYxtLfnGlk22OkQhPHrO6BnMgtdI,5040
84
+ pyinfra/operations/bsdinit.py,sha256=HtBJERhSiBPaTG0H-m4CG6SY_7iCkl0LtHLGYuNYhVM,1578
85
+ pyinfra/operations/cargo.py,sha256=wcEhQEz02e6_WGL6ve_bW1IOrnHQqOGzhyMiMjmm0co,1042
86
+ pyinfra/operations/choco.py,sha256=Qr2lg471XiIhMJ4QvUbmRMNCP-3BNE4VbxNaJE-JjzU,1453
87
+ pyinfra/operations/dnf.py,sha256=qN9xwLzSFOOJwuUSDhRLTE2TdaNB58HYgtKZMHVn494,5550
88
+ pyinfra/operations/files.py,sha256=9I5c823Y4hoAsXVHcAK5TixV8fMIbHGOJEzOBPxi1Fc,52485
89
+ pyinfra/operations/gem.py,sha256=vEGYFniRGrxll8ARNauZQdSPjSHP8-me4UEH1srK-q0,1070
90
+ pyinfra/operations/git.py,sha256=mxK2q8Hl3xmo27qz9cRCzVvNxK9UPeG3YFh4cV5fSSM,11543
91
+ pyinfra/operations/iptables.py,sha256=moaeEfjrPLHZSiq6vgVRCTXE9191aKF5WlGccHywO9k,9009
92
+ pyinfra/operations/launchd.py,sha256=i5oeCEekOEQTVlNlayQO057DRXT103H3tWRwp8IRVko,1164
93
+ pyinfra/operations/lxd.py,sha256=pcdvmxfG6Bm8m_cuF1wRpmpaUzTq2nTd6iOf4jDRicA,1639
94
+ pyinfra/operations/mysql.py,sha256=wtuUi9IhPaehe3qSFf_woEUpPD8mASAIisdIYbnNy3c,19141
95
+ pyinfra/operations/npm.py,sha256=PyQJ2DQ_u0jclHNLL21ltUV64VPhC9rriGv5HOc75zY,1404
96
+ pyinfra/operations/openrc.py,sha256=eta2j16uC24ZHFBB1CVgV1BdzuvY7S5JjcyGA_iVyYw,1510
97
+ pyinfra/operations/pacman.py,sha256=qPtgIzH0151qhmxzoT4rz5xunffNOICcscknCkzLr8o,1672
98
+ pyinfra/operations/pip.py,sha256=jvUBAalQnFtZFDL5dqSOnBjAWEgzIGQNxHLMPUMvT3Y,5699
99
+ pyinfra/operations/pkg.py,sha256=sLa3-_YoRMkGNdCovduaZwtAcuADDdaeiKWnIHDiq_k,2222
100
+ pyinfra/operations/pkgin.py,sha256=hL_l9kN7Dn68CwPd2efrcJoa2KOToTHLhMpi1P8k3oQ,1930
101
+ pyinfra/operations/postgres.py,sha256=ASCPx_WZLk31sZUXHbP_CT5Xr2xz6KwnV-EG6xzPSIo,9152
102
+ pyinfra/operations/postgresql.py,sha256=79i5q3mtFVl3-B8V2FGLmy1n_O5A5i5BCf-ncp90UAI,797
103
+ pyinfra/operations/puppet.py,sha256=EOT4RnYro9K6N_HrPvYHd3bZX8rcAQxPNfLcuzm-LqE,797
104
+ pyinfra/operations/python.py,sha256=lQ8lAwy-d_Gg9PVuZVn9-Dl3r5K_XfyUeRKZwekHiuI,1909
105
+ pyinfra/operations/selinux.py,sha256=v9Wt1-uLButowbNP8iSEYXSXMd7xAsGp6U9EBXUq5sw,5347
106
+ pyinfra/operations/server.py,sha256=evcQgux6fAU5v9z1XUr7ELob2t8HI9n70U5mi0iYm5k,35710
107
+ pyinfra/operations/snap.py,sha256=_K-0UdketVIJMe3VlvfvnKGd6NM_3PC-ZzZeeMiGHME,2987
108
+ pyinfra/operations/ssh.py,sha256=qrU13gmR-XUcT7l7PvRDfU6WhmfOXd50DZKSZASIyiE,5493
109
+ pyinfra/operations/systemd.py,sha256=EpQqLNo9P6tnBdre7E7X2UuL-CeK8YJ1wwgr8cKKe5s,3818
110
+ pyinfra/operations/sysvinit.py,sha256=cAtfKmGZ0T1HxF0KNTLEU-CrS97n1Vpby58jB3S1Eho,4003
111
+ pyinfra/operations/upstart.py,sha256=1lM09OBzH0vWylCHEA_zZPOv_x5W8DVKpnlAd-km7Rc,1908
112
+ pyinfra/operations/vzctl.py,sha256=konF-T1KyqZaltRK9BMoUGse8TQb89J2Xbn3kcXh1uM,3010
113
+ pyinfra/operations/xbps.py,sha256=vuWwPUqYRIX9kcmg37KjZdtTJUYenG1J8KYFKkIiles,1446
114
+ pyinfra/operations/yum.py,sha256=3H6j7gq0ME-u1rBFjV5r3Q4CZErsaAlbLeK6ipuvv8U,5543
115
+ pyinfra/operations/zypper.py,sha256=ZZz01tViqVoO185kIJfNj_0H4dnZgRhqFxgCKOH1xXQ,5494
116
+ pyinfra/operations/util/__init__.py,sha256=ZAHjeCXtLo0TIOSfZ9h0Sh5IXXRCspfHs3RR1l8tQCE,366
117
+ pyinfra/operations/util/files.py,sha256=UwuaGH8_g_glC4QW3LKH7MrzoBpQJ8mk11_g_rk9a8c,3339
118
+ pyinfra/operations/util/packaging.py,sha256=fNQaLRtGVrEWFqz2pRAB2nvc1rE7Xd29sXJClzZAChg,8300
119
+ pyinfra/operations/util/service.py,sha256=eT_-3r1Lc0aNsNI0p-ocPGjoMfsdcDADqHU82T7GKFE,1031
120
+ pyinfra_cli/__init__.py,sha256=G0X7tNdqT45uWuK3aHIKxMdDeCgJ7zHo6vbxoG6zy_8,284
121
+ pyinfra_cli/__main__.py,sha256=8tjq8HUll8P8naFw7pGlygwSz7u9je_MQ-0pqcDlENY,881
122
+ pyinfra_cli/commands.py,sha256=J-mCJYvDebJ8M7o3HreB2zToa871-xO6_KjVhPLeHho,1832
123
+ pyinfra_cli/exceptions.py,sha256=b14C3xZ6PMqe1q-XosozPNhbABVIAdeivWoTdBn77ZE,4953
124
+ pyinfra_cli/inventory.py,sha256=mgj_T_T-lCy6Diyb466doRKIcz4zXLhRJi3ui_VBlXM,9513
125
+ pyinfra_cli/log.py,sha256=7WEGtmf3ncF1BtXL2icUjyxeRKy-7XrCcQ2Hg4GWX5Y,2201
126
+ pyinfra_cli/main.py,sha256=MsBn0RCD5ce4GY-dDBe6vLXT0LanDrrQZpJOTIYZPBs,19715
127
+ pyinfra_cli/prints.py,sha256=MGU8DvHGiE4ZRVPee1Mixia6VWB3zn0OWn7FwTASWpc,9006
128
+ pyinfra_cli/util.py,sha256=7z6xg1GtbD_lB40yLL_m2EwGVTly0Z7V8oeAdQXnKi0,6322
129
+ pyinfra_cli/virtualenv.py,sha256=6j9W54JkQLN02SrZZIVwszp0GxlaaDEUWFZjBDHIWNA,2466
130
+ tests/test_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
+ tests/test_api/test_api.py,sha256=Ig2ebkNACYbHcC4_zRkxS9vj5ZEogoPqGx30ErIKChg,2413
132
+ tests/test_api/test_api_arguments.py,sha256=5k7w0_x5cnABEFOk0LQBCt5gU9iTN9lo2XS6MlJTnhQ,1961
133
+ tests/test_api/test_api_command.py,sha256=OW0ESMyS5vo38u17DHeCrSIaIkW9gMU5PSkXL7mRrq0,3204
134
+ tests/test_api/test_api_config.py,sha256=bf0mDrUie3On6zGC_hJBpv-wvSf3LHBIBzUDvkopEt0,708
135
+ tests/test_api/test_api_deploys.py,sha256=h_zbI6CK4K8SdzEr3LEAMPxOf9hnQBdi_suqiNPqHHQ,4200
136
+ tests/test_api/test_api_facts.py,sha256=fUPadZbZ5xaKSF-kmLj7XGwsNiBmfj7Av0gl8fE01Qc,10687
137
+ tests/test_api/test_api_host.py,sha256=U_VW2vTl35vR8EdyIGMKr4y0ydsDLbvHSjZDa99CyNE,1119
138
+ tests/test_api/test_api_inventory.py,sha256=VLbV0MXdRLOPvTXJF156ne6rAx1cBlFfgq_1S79s4tw,2013
139
+ tests/test_api/test_api_operations.py,sha256=OqLA-d5i-3FWu4rx6Hj_IyjKEp5wrqQ4za1tNQFPJRs,20144
140
+ tests/test_api/test_api_util.py,sha256=uHv4oLpoy1_tzOoqFA1zpdvC74SvjitZbxQwp0dmjTs,1716
141
+ tests/test_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
+ tests/test_cli/test_cli.py,sha256=nZQH0zK1SOgIr5VxBuuHH68hyzG4lhwyw_Z7EhjPtf4,6045
143
+ tests/test_cli/test_cli_deploy.py,sha256=KBnnDsiD21h7t1S2JXpEDpiMxh0AFqwxaEl0z78IE9E,4858
144
+ tests/test_cli/test_cli_exceptions.py,sha256=02sjC6rMptuqchgcdjdsVNQbSQYW6HwGutSy6Q6sMs4,3088
145
+ tests/test_cli/test_cli_util.py,sha256=-Ehnj0cO-EkF-6KLxcPPcFeuAUMTz-fKITrxhuiYhV4,2562
146
+ tests/test_cli/test_context_objects.py,sha256=JiUTwQP7yvcqA47Kq9jtdsB_Z8nxGMZN46d9pR--FYA,2130
147
+ tests/test_cli/util.py,sha256=kp_-XsGnTyDgG6IHWorYzl5VD_WLe77dKOH007TDOUE,338
148
+ tests/test_connectors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
149
+ tests/test_connectors/test_chroot.py,sha256=QK7YgFPXzHh8y363-tmHvzZ0Ok5PVJWFTDAvwt91eac,5907
150
+ tests/test_connectors/test_docker.py,sha256=0EjkfhCHpLCfL4X-AIdMNw5ASaseY0tbRAn7T_TAkMQ,6566
151
+ tests/test_connectors/test_dockerssh.py,sha256=MaC9IK1OZDiqoIsuLOZBJnPDglsMoPDoL19LQtXsyCE,9303
152
+ tests/test_connectors/test_local.py,sha256=N_FkejDZKu7XLnKeApqfBARYMyxf-hRXCQJrXLHvwRg,7442
153
+ tests/test_connectors/test_ssh.py,sha256=6YPdNv_h12hn6C7Gksuyflf3V0cdvlc8o4e8oWBv-iM,38399
154
+ tests/test_connectors/test_sshuserclient.py,sha256=2PQNLPhNL6lBACc6tQuXmPoog-9L6AdDQNrA-rEw1_8,5734
155
+ tests/test_connectors/test_terraform.py,sha256=Z5MhgDeRDFumu-GlbjMD0ZRkecwBIPP8C8ZVg-mq7C8,3743
156
+ tests/test_connectors/test_util.py,sha256=hQir0WyjH0LEF6xvIyHNyqdI5pkJX6qUR9287MgO2bY,4647
157
+ tests/test_connectors/test_vagrant.py,sha256=_MBX2b7I-FlEX4rcKeaEcJBSmpCtxxcwJN-7yY_Ivbk,3646
158
+ pyinfra-3.0b1.dist-info/LICENSE.md,sha256=gwC95tUll0gwB32tHNkTAasN7Sb6vjWzXa305NwClbI,1076
159
+ pyinfra-3.0b1.dist-info/METADATA,sha256=w4CVwxaxwspgoqLhaa04KKS3Ge8FcQj8lixIoQ9mUPc,8168
160
+ pyinfra-3.0b1.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110
161
+ pyinfra-3.0b1.dist-info/entry_points.txt,sha256=BraEFyquy05M8ch33HZXOHoH_m2BTqejL3xX3NrpzOM,471
162
+ pyinfra-3.0b1.dist-info/top_level.txt,sha256=2K6D1mK35JTSEBgOfEPV-N-uA2SDErxGiE0J-HUMMVI,26
163
+ pyinfra-3.0b1.dist-info/RECORD,,
@@ -0,0 +1,11 @@
1
+ [console_scripts]
2
+ pyinfra = pyinfra_cli.__main__:execute_pyinfra
3
+
4
+ [pyinfra.connectors]
5
+ chroot = pyinfra.connectors.chroot:ChrootConnector
6
+ docker = pyinfra.connectors.docker:DockerConnector
7
+ dockerssh = pyinfra.connectors.dockerssh:DockerSSHConnector
8
+ local = pyinfra.connectors.local:LocalConnector
9
+ ssh = pyinfra.connectors.ssh:SSHConnector
10
+ terraform = pyinfra.connectors.terraform:TerraformInventoryConnector
11
+ vagrant = pyinfra.connectors.vagrant:VagrantInventoryConnector
pyinfra_cli/__main__.py CHANGED
@@ -15,6 +15,8 @@ pyinfra.is_cli = True
15
15
  # Don't write out deploy.pyc/config.pyc etc
16
16
  sys.dont_write_bytecode = True
17
17
 
18
+ sys.path.append(".")
19
+
18
20
  # Shut it click
19
21
  click.disable_unicode_literals_warning = True # type: ignore
20
22