CaptureMock 2.7.2__tar.gz → 2.7.4__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 (87) hide show
  1. {capturemock-2.7.2 → capturemock-2.7.4}/CaptureMock.egg-info/PKG-INFO +1 -1
  2. {capturemock-2.7.2 → capturemock-2.7.4}/PKG-INFO +1 -1
  3. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__init__.py +5 -3
  4. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/__init__.cpython-312.pyc +0 -0
  5. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/__init__.cpython-313.pyc +0 -0
  6. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/amqptraffic.cpython-313.pyc +0 -0
  7. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/binarytcptraffic.cpython-313.pyc +0 -0
  8. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/cmdlineutils.cpython-313.pyc +0 -0
  9. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/config.cpython-312.pyc +0 -0
  10. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/server.cpython-313.pyc +0 -0
  11. capturemock-2.7.4/capturemock/__pycache__/traffic.cpython-312.pyc +0 -0
  12. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/amqptraffic.py +1 -1
  13. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/binarytcptraffic.py +4 -4
  14. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/cmdlineutils.py +2 -0
  15. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/ftptraffic.py +2 -2
  16. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/server.py +31 -19
  17. capturemock-2.7.2/capturemock/__pycache__/traffic.cpython-312.pyc +0 -0
  18. {capturemock-2.7.2 → capturemock-2.7.4}/CaptureMock.egg-info/SOURCES.txt +0 -0
  19. {capturemock-2.7.2 → capturemock-2.7.4}/CaptureMock.egg-info/dependency_links.txt +0 -0
  20. {capturemock-2.7.2 → capturemock-2.7.4}/CaptureMock.egg-info/entry_points.txt +0 -0
  21. {capturemock-2.7.2 → capturemock-2.7.4}/CaptureMock.egg-info/top_level.txt +0 -0
  22. {capturemock-2.7.2 → capturemock-2.7.4}/MANIFEST.in +0 -0
  23. {capturemock-2.7.2 → capturemock-2.7.4}/README.txt +0 -0
  24. {capturemock-2.7.2 → capturemock-2.7.4}/bin/capturemock_intercept.py +0 -0
  25. {capturemock-2.7.2 → capturemock-2.7.4}/bin/capturemock_server.py +0 -0
  26. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/CaptureMock.spec +0 -0
  27. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/__init__.cpython-311.pyc +0 -0
  28. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/capturecommand.cpython-311.pyc +0 -0
  29. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/capturecommand.cpython-312.pyc +0 -0
  30. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/capturecommand.cpython-313.pyc +0 -0
  31. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/capturepython.cpython-311.pyc +0 -0
  32. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/capturepython.cpython-312.pyc +0 -0
  33. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/capturepython.cpython-313.pyc +0 -0
  34. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/clientservertraffic.cpython-311.pyc +0 -0
  35. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/clientservertraffic.cpython-313.pyc +0 -0
  36. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/cmdlineutils.cpython-311.pyc +0 -0
  37. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/cmdlineutils.cpython-312.pyc +0 -0
  38. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/commandlinetraffic.cpython-311.pyc +0 -0
  39. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/commandlinetraffic.cpython-313.pyc +0 -0
  40. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/config.cpython-311.pyc +0 -0
  41. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/config.cpython-313.pyc +0 -0
  42. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/customtraffic.cpython-311.pyc +0 -0
  43. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/customtraffic.cpython-313.pyc +0 -0
  44. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/encodingutils.cpython-311.pyc +0 -0
  45. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/encodingutils.cpython-313.pyc +0 -0
  46. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/fileedittraffic.cpython-311.pyc +0 -0
  47. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/fileedittraffic.cpython-312.pyc +0 -0
  48. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/fileedittraffic.cpython-313.pyc +0 -0
  49. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/id_mapping.cpython-311.pyc +0 -0
  50. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/id_mapping.cpython-312.pyc +0 -0
  51. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/id_mapping.cpython-313.pyc +0 -0
  52. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/pythonclient.cpython-311.pyc +0 -0
  53. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/pythonclient.cpython-312.pyc +0 -0
  54. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/pythonclient.cpython-313.pyc +0 -0
  55. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/pythontraffic.cpython-313.pyc +0 -0
  56. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/recordfilehandler.cpython-311.pyc +0 -0
  57. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/recordfilehandler.cpython-313.pyc +0 -0
  58. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/replayinfo.cpython-311.pyc +0 -0
  59. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/replayinfo.cpython-313.pyc +0 -0
  60. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/server.cpython-311.pyc +0 -0
  61. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/traffic.cpython-311.pyc +0 -0
  62. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/__pycache__/traffic.cpython-313.pyc +0 -0
  63. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/capturecommand.py +0 -0
  64. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/capturemock_intercept.exe +0 -0
  65. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/capturepython.py +0 -0
  66. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/clientservertraffic.py +0 -0
  67. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/commandlinetraffic.py +0 -0
  68. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/config.py +0 -0
  69. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/customtraffic.py +0 -0
  70. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/encodingutils.py +0 -0
  71. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/fileedittraffic.py +0 -0
  72. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/id_mapping.py +0 -0
  73. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/log/__pycache__/logconfiggen.cpython-312.pyc +0 -0
  74. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/log/logging.conf +0 -0
  75. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/log/regenerate_log_config.py +0 -0
  76. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/python_script.exe +0 -0
  77. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/pythonclient.py +0 -0
  78. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/pythontraffic.py +0 -0
  79. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/recordfilehandler.py +0 -0
  80. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/replayinfo.py +0 -0
  81. {capturemock-2.7.2 → capturemock-2.7.4}/capturemock/traffic.py +0 -0
  82. {capturemock-2.7.2 → capturemock-2.7.4}/doc/AUTHORS +0 -0
  83. {capturemock-2.7.2 → capturemock-2.7.4}/doc/COPYING +0 -0
  84. {capturemock-2.7.2 → capturemock-2.7.4}/doc/ChangeLog +0 -0
  85. {capturemock-2.7.2 → capturemock-2.7.4}/doc/LICENSE +0 -0
  86. {capturemock-2.7.2 → capturemock-2.7.4}/pyproject.toml +0 -0
  87. {capturemock-2.7.2 → capturemock-2.7.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: CaptureMock
3
- Version: 2.7.2
3
+ Version: 2.7.4
4
4
  Summary: A tool for creating mocks via a capture-replay style approach
5
5
  Author-email: Geoff Bache <geoff.bache@pobox.com>
6
6
  Project-URL: Homepage, http://www.texttest.org/index.php?page=capturemock
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: CaptureMock
3
- Version: 2.7.2
3
+ Version: 2.7.4
4
4
  Summary: A tool for creating mocks via a capture-replay style approach
5
5
  Author-email: Geoff Bache <geoff.bache@pobox.com>
6
6
  Project-URL: Homepage, http://www.texttest.org/index.php?page=capturemock
@@ -12,7 +12,7 @@ from datetime import datetime
12
12
  import bisect
13
13
  from urllib.request import urlopen
14
14
 
15
- version = "2.7.2"
15
+ version = "2.7.4"
16
16
 
17
17
  class CaptureMockManager:
18
18
  fileContents = "import capturemock; capturemock.interceptCommand()\n"
@@ -39,7 +39,8 @@ class CaptureMockManager:
39
39
  sutDirectory=os.getcwd(),
40
40
  environment=os.environ,
41
41
  stderrFn=None,
42
- recordFromUrl=None):
42
+ recordFromUrl=None,
43
+ port=0):
43
44
  if config.isActive(mode, replayFile):
44
45
  # Environment which the server should get
45
46
  environment["CAPTUREMOCK_MODE"] = str(mode)
@@ -59,7 +60,8 @@ class CaptureMockManager:
59
60
  recordEditDir,
60
61
  sutDirectory,
61
62
  environment,
62
- stderrFn)
63
+ stderrFn,
64
+ port)
63
65
  self.serverProtocol = rcHandler.get("server_protocol", [ "general" ], "classic")
64
66
  self.serverAddress = self.readServerAddress()
65
67
 
@@ -93,7 +93,7 @@ class AMQPConnector:
93
93
 
94
94
  class AMQPTrafficServer:
95
95
  @classmethod
96
- def createServer(cls, address, dispatcher):
96
+ def createServer(cls, address, port, dispatcher):
97
97
  return cls(dispatcher)
98
98
 
99
99
  def __init__(self, dispatcher):
@@ -1009,15 +1009,15 @@ class SynchStatusTraffic(clientservertraffic.ClientSocketTraffic):
1009
1009
  class TcpHeaderTrafficServer:
1010
1010
  synch_server_locations = []
1011
1011
  @classmethod
1012
- def createServer(cls, address, dispatcher):
1013
- return cls(address, dispatcher)
1012
+ def createServer(cls, *args):
1013
+ return cls(*args)
1014
1014
 
1015
- def __init__(self, address, dispatcher):
1015
+ def __init__(self, address, port, dispatcher):
1016
1016
  self.dispatcher = dispatcher
1017
1017
  self.connection_timeout = dispatcher.rcHandler.getfloat("connection_timeout", [ "general" ], 0.2)
1018
1018
  self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1019
1019
  self.socket.settimeout(self.connection_timeout)
1020
- self.socket.bind((address, 0))
1020
+ self.socket.bind((address, port))
1021
1021
  self.socket.listen()
1022
1022
  self.diag = get_logger()
1023
1023
  self.clientConverter = None
@@ -19,4 +19,6 @@ CaptureMock command line program. Records and replays interaction defined by stu
19
19
  parser.add_option("-F", "--record-file-edits",
20
20
  help="store edited files under DIR.", metavar="DIR")
21
21
  parser.add_option("-R", "--rcfiles", help="Read configuration from given rc files, defaults to ~/.capturemock/config")
22
+ parser.add_option("-P", "--port", type="int", default=0,
23
+ help="Port to run CaptureMock on", metavar="PORT")
22
24
  return parser
@@ -57,8 +57,8 @@ class FTPTrafficHandler(FTPHandler):
57
57
 
58
58
  class FtpTrafficServer:
59
59
  @classmethod
60
- def createServer(cls, address, dispatcher):
61
- return cls((address, 0), dispatcher)
60
+ def createServer(cls, address, port, dispatcher):
61
+ return cls((address, port), dispatcher)
62
62
 
63
63
  def __init__(self, address, dispatcher):
64
64
  self.count = 0
@@ -49,7 +49,8 @@ def startServer(rcFiles,
49
49
  recordEditDir,
50
50
  sutDirectory,
51
51
  environment,
52
- stderrFn):
52
+ stderrFn,
53
+ port):
53
54
  cmdArgs = getServer() + [ "-m", str(mode) ]
54
55
  if rcFiles:
55
56
  cmdArgs += [ "--rcfiles", ",".join(rcFiles) ]
@@ -63,13 +64,22 @@ def startServer(rcFiles,
63
64
  if replayEditDir:
64
65
  cmdArgs += [ "-f", replayEditDir ]
65
66
 
67
+ if port:
68
+ cmdArgs += [ "-P", str(port) ]
69
+
66
70
  stderr = open(stderrFn, "w") if stderrFn else subprocess.PIPE
71
+ # Platform-specific process isolation, to avoid Ctrl-C killing the server
72
+ if sys.platform == "win32":
73
+ platform_kw = { "creationflags": subprocess.CREATE_NEW_PROCESS_GROUP }
74
+ else:
75
+ platform_kw = { "preexec_fn": os.setpgrp }
67
76
  return subprocess.Popen(cmdArgs,
68
77
  env=environment.copy(),
69
78
  universal_newlines=True,
70
79
  cwd=sutDirectory,
71
80
  stdout=subprocess.PIPE,
72
- stderr=stderr)
81
+ stderr=stderr,
82
+ **platform_kw)
73
83
 
74
84
  def stopServer(servAddr, protocol):
75
85
  if protocol == "http":
@@ -147,9 +157,9 @@ class ClassicTrafficServer:
147
157
 
148
158
  class ClassicTcpTrafficServer(ClassicTrafficServer, TCPServer):
149
159
  @classmethod
150
- def createServer(cls, address, dispatcher):
160
+ def createServer(cls, address, port, dispatcher):
151
161
  ClassicTcpTrafficRequestHandler.dispatcher = dispatcher
152
- return cls((address, 0), ClassicTcpTrafficRequestHandler, dispatcher.useThreads)
162
+ return cls((address, port), ClassicTcpTrafficRequestHandler, dispatcher.useThreads)
153
163
 
154
164
  def __init__(self, addrinfo, handlerClass, useThreads):
155
165
  ClassicTrafficServer.__init__(self)
@@ -179,18 +189,18 @@ class ClassicTcpTrafficServer(ClassicTrafficServer, TCPServer):
179
189
 
180
190
  class ClassicUdpTrafficServer(ClassicTrafficServer, UDPServer):
181
191
  @classmethod
182
- def createServer(cls, ip, dispatcher):
192
+ def createServer(cls, ip, port, dispatcher):
183
193
  ClassicUdpTrafficRequestHandler.dispatcher = dispatcher
184
194
  broadcast = dispatcher.rcHandler.getboolean("broadcast", [ "general" ], False)
185
195
  if broadcast:
186
196
  # common pattern with UDP broadcasting
187
197
  cls.allow_reuse_address = True
188
- return cls(ip, ClassicUdpTrafficRequestHandler, broadcast)
198
+ return cls(ip, port, ClassicUdpTrafficRequestHandler, broadcast)
189
199
 
190
- def __init__(self, ip, handlerClass, broadcast):
200
+ def __init__(self, ip, port, handlerClass, broadcast):
191
201
  ClassicTrafficServer.__init__(self)
192
202
  bindHost = "0.0.0.0" if broadcast else ip
193
- UDPServer.__init__(self, (bindHost, 0), handlerClass)
203
+ UDPServer.__init__(self, (bindHost, port), handlerClass)
194
204
  self.ip = ip
195
205
  clientservertraffic.ClientSocketTraffic.socketType = socket.SOCK_DGRAM
196
206
  clientservertraffic.ClientSocketTraffic.broadcast = broadcast
@@ -222,12 +232,14 @@ class ClassicTcpTrafficRequestHandler(StreamRequestHandler):
222
232
  self.wfile.write(("CAPTUREMOCK MISMATCH: " + str(e)).encode())
223
233
 
224
234
  class UdpSocketFile:
225
- def __init__(self, sock, address):
226
- self.socket = sock
235
+ def __init__(self, local_ip, address):
236
+ self.local_ip = local_ip
227
237
  self.address = address
228
238
 
229
239
  def write(self, data):
230
- self.socket.sendto(data, self.address)
240
+ sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
241
+ sock.bind((self.local_ip, 0))
242
+ sock.sendto(data, self.address)
231
243
 
232
244
  def close(self):
233
245
  pass # don't close the socket!
@@ -244,7 +256,7 @@ class ClassicUdpTrafficRequestHandler(BaseRequestHandler):
244
256
 
245
257
  def handleText(self, text):
246
258
  self.dispatcher.diag.debug("Received incoming UDP request...\n" + text)
247
- wfile = UdpSocketFile(self.request[1], self.client_address)
259
+ wfile = UdpSocketFile(self.dispatcher.server.ip, self.client_address)
248
260
  try:
249
261
  self.dispatcher.processText(text, wfile, self.requestNumber)
250
262
  except config.CaptureMockReplayError as e:
@@ -443,9 +455,9 @@ class HTTPTrafficHandler(BaseHTTPRequestHandler):
443
455
 
444
456
  class HTTPTrafficServer(HTTPServer):
445
457
  @classmethod
446
- def createServer(cls, address, dispatcher):
458
+ def createServer(cls, address, port, dispatcher):
447
459
  HTTPTrafficHandler.dispatcher = dispatcher
448
- return cls((address, 0))
460
+ return cls((address, port))
449
461
 
450
462
  def __init__(self, address):
451
463
  # Default value of 5 isn't very much...
@@ -484,8 +496,8 @@ class HTTPTrafficServer(HTTPServer):
484
496
 
485
497
  class XmlRpcTrafficServer(SimpleXMLRPCServer):
486
498
  @classmethod
487
- def createServer(cls, address, dispatcher):
488
- server = cls((address, 0), logRequests=False, use_builtin_types=True)
499
+ def createServer(cls, address, port, dispatcher):
500
+ server = cls((address, port), logRequests=False, use_builtin_types=True)
489
501
  server.register_instance(XmlRpcDispatchInstance(dispatcher))
490
502
  return server
491
503
 
@@ -809,15 +821,15 @@ class ServerDispatcher(ServerDispatcherBase):
809
821
  def __init__(self, options):
810
822
  ServerDispatcherBase.__init__(self, options)
811
823
  self.terminate = False
812
- self.server = self.makeServer()
824
+ self.server = self.makeServer(options.port)
813
825
  address = self.server.getAddress()
814
826
  self.rcHandler.address = address
815
827
  sys.stdout.write(address + "\n") # Tell our caller, so they can tell the program being handled
816
828
  sys.stdout.flush()
817
829
 
818
- def makeServer(self):
830
+ def makeServer(self, port):
819
831
  ipAddress = self.getIpAddress()
820
- return self.serverClass.createServer(ipAddress, self)
832
+ return self.serverClass.createServer(ipAddress, port, self)
821
833
 
822
834
  def getIpAddress(self):
823
835
  # Code below can cause complications with VPNs etc. Default is local access only, sufficient in 99.9% of cases
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes