File: stub_handle.py

package info (click to toggle)
python-pyforge 1.4.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 464 kB
  • sloc: python: 3,666; makefile: 12; sh: 7
file content (58 lines) | stat: -rw-r--r-- 2,103 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
from .handle import ForgeHandle
from .signature import FunctionSignature
from .bound_signature_adapter import BoundSignatureAdapter

class StubHandle(ForgeHandle):
    def __init__(self, forge, stub, original, name=None):
        super(StubHandle, self).__init__(forge)
        self.stub = stub
        self.name = name
        self.original = original
        self.signature = FunctionSignature(self.original)
        self._call_count = 0
        self._call_count_session_id = 0

    @property
    def call_count(self):
        if self.forge.session_id == self._call_count_session_id:
            return self._call_count
        return 0

    def _describe(self):
        if self.name is not None:
            return self.name
        return self.original.__name__

    def bind(self, obj):
        self.signature = BoundSignatureAdapter(self.signature, obj)

    def is_bound(self):
        return self.signature.is_bound_method()

    def handle_call(self, args, kwargs, caller_info):
        if self.forge.is_recording():
            returned = self._handle_recorded_call(args, kwargs, caller_info)
            self.forge.stubs.mark_stub_recorded(self.stub)
            return returned
        else:
            return self._handle_replay_call(args, kwargs, caller_info)

    def _handle_recorded_call(self, args, kwargs, caller_info):
        return self.forge.queue.push_call(self.stub, args, kwargs, caller_info)

    def _handle_replay_call(self, args, kwargs, caller_info):
        expected_call = self.forge.queue.pop_matching_call(self.stub, args, kwargs, caller_info)
        return_value = expected_call.get_return_value()
        self._increment_call_count()
        #might raise...
        expected_call.do_side_effects(args, kwargs)
        return return_value

    def _increment_call_count(self):
        if self._call_count_session_id != self.forge.session_id:
            self._call_count_session_id = self.forge.session_id
            self._call_count = 0
        self._call_count += 1

    def has_recorded_calls(self):
        return self.forge.stubs.was_stub_recorded(self.stub)