1+ """A module to mock the data bus transactions."""
2+
13from enum import Enum , auto
24import sys
35from typing import List
46
57import circuitpython_typing
68
79from circuitpython_mocks .busio .operations import (
8- Read ,
9- Write ,
10- Transfer ,
10+ UARTRead ,
11+ UARTWrite ,
1112 I2CRead ,
1213 I2CWrite ,
1314 I2CTransfer ,
15+ SPIRead ,
16+ SPIWrite ,
17+ SPITransfer ,
1418)
1519from circuitpython_mocks ._mixins import Expecting , Lockable
1620from circuitpython_mocks .board import Pin
1721
1822
1923class I2C (Expecting , Lockable ):
24+ """A mock of `busio.I2C` class."""
25+
2026 def __init__ (
2127 self ,
2228 scl : Pin ,
@@ -28,6 +34,8 @@ def __init__(
2834 super ().__init__ ()
2935
3036 def scan (self ) -> List [int ]:
37+ """Returns an empty list.
38+ Use :py:meth:`pytest.MonkeyPatch.setattr()` to change this output."""
3139 return []
3240
3341 def readfrom_into (
@@ -38,6 +46,9 @@ def readfrom_into(
3846 start : int = 0 ,
3947 end : int = sys .maxsize ,
4048 ) -> None :
49+ """A mock imitation of :external:py:meth:`busio.I2C.readfrom_into()`.
50+ This function checks against `I2CRead`
51+ :py:attr:`~circuitpython_mocks._mixins.Expecting.expectations`"""
4152 assert self .expectations , "no expectation found for I2C.readfrom_into()"
4253 op = self .expectations .popleft ()
4354 assert isinstance (op , I2CRead ), f"Read operation expected, found { repr (op )} "
@@ -53,6 +64,9 @@ def writeto(
5364 start : int = 0 ,
5465 end : int = sys .maxsize ,
5566 ) -> None :
67+ """A mock imitation of :external:py:meth:`busio.I2C.writeto()`.
68+ This function checks against `I2CWrite`
69+ :py:attr:`~circuitpython_mocks._mixins.Expecting.expectations`"""
5670 assert self .expectations , "no expectation found for I2C.writeto()"
5771 op = self .expectations .popleft ()
5872 assert isinstance (op , I2CWrite ), f"Read operation expected, found { repr (op )} "
@@ -70,6 +84,9 @@ def writeto_then_readfrom(
7084 in_start : int = 0 ,
7185 in_end : int = sys .maxsize ,
7286 ) -> None :
87+ """A mock imitation of :external:py:meth:`busio.I2C.writeto_then_readfrom()`.
88+ This function checks against `I2CTransfer`
89+ :py:attr:`~circuitpython_mocks._mixins.Expecting.expectations`"""
7390 assert self .expectations , "no expectation found for I2C.writeto_then_readfrom()"
7491 op = self .expectations .popleft ()
7592 assert isinstance (
@@ -89,6 +106,7 @@ def __init__(
89106 MISO : Pin | None = None ,
90107 half_duplex : bool = False ,
91108 ):
109+ """A class to mock :external:py:class:`busio.SPI`."""
92110 super ().__init__ ()
93111 self ._frequency = 1000000
94112
@@ -100,10 +118,12 @@ def configure(
100118 phase : int = 0 ,
101119 bits : int = 8 ,
102120 ) -> None :
121+ """A dummy function to mock :external:py:meth:`busio.SPI.configure()`"""
103122 self ._frequency = baudrate
104123
105124 @property
106125 def frequency (self ) -> int :
126+ """Returns the value passed to ``baudrate`` parameter of `configure()`."""
107127 return self ._frequency
108128
109129 def write (
@@ -113,9 +133,12 @@ def write(
113133 start : int = 0 ,
114134 end : int = sys .maxsize ,
115135 ) -> None :
136+ """A function that mocks :external:py:meth:`busio.SPI.write()`.
137+ This function checks against `SPIWrite`
138+ :py:attr:`~circuitpython_mocks._mixins.Expecting.expectations`"""
116139 assert self .expectations , "no expectation found for SPI.write()"
117140 op = self .expectations .popleft ()
118- assert isinstance (op , Write ), f"Read operation expected, found { repr (op )} "
141+ assert isinstance (op , SPIWrite ), f"Read operation expected, found { repr (op )} "
119142 op .assert_expected (buffer , start , end )
120143
121144 def readinto (
@@ -126,9 +149,12 @@ def readinto(
126149 end : int = sys .maxsize ,
127150 write_value : int = 0 ,
128151 ) -> None :
152+ """A function that mocks :external:py:meth:`busio.SPI.readinto()`.
153+ This function checks against `SPIRead`
154+ :py:attr:`~circuitpython_mocks._mixins.Expecting.expectations`"""
129155 assert self .expectations , "no expectation found for SPI.readinto()"
130156 op = self .expectations .popleft ()
131- assert isinstance (op , Read ), f"Read operation expected, found { repr (op )} "
157+ assert isinstance (op , SPIRead ), f"Read operation expected, found { repr (op )} "
132158 op .assert_response (buffer , start , end )
133159
134160 def write_readinto (
@@ -141,20 +167,23 @@ def write_readinto(
141167 in_start : int = 0 ,
142168 in_end : int = sys .maxsize ,
143169 ) -> None :
170+ """A function that mocks :external:py:meth:`busio.SPI.write_readinto()`.
171+ This function checks against `SPITransfer`
172+ :py:attr:`~circuitpython_mocks._mixins.Expecting.expectations`"""
144173 assert self .expectations , "no expectation found for I2C.writeto_then_readfrom()"
145174 op = self .expectations .popleft ()
146175 assert isinstance (
147- op , Transfer
176+ op , SPITransfer
148177 ), f"Transfer operation expected, found { repr (op )} "
149178 op .assert_transaction (
150179 out_buffer , in_buffer , out_start , out_end , in_start , in_end
151180 )
152181
153182
154183class UART (Expecting , Lockable ):
155- class Parity (Enum ):
156- """Parity Enumeration"""
184+ """A class that mocks :external:py:class:`busio.UART`."""
157185
186+ class Parity (Enum ):
158187 ODD = auto ()
159188 EVEN = auto ()
160189
@@ -177,35 +206,47 @@ def __init__(
177206 super ().__init__ ()
178207
179208 def read (self , nbytes : int | None = None ) -> bytes | None :
209+ """A function that mocks :external:py:meth:`busio.UART.read()`.
210+ This function checks against `UARTRead`
211+ :py:attr:`~circuitpython_mocks._mixins.Expecting.expectations`"""
180212 assert self .expectations , "no expectation found for UART.read()"
181213 op = self .expectations .popleft ()
182- assert isinstance (op , Read ), f"Read operation expected, found { repr (op )} "
214+ assert isinstance (op , UARTRead ), f"Read operation expected, found { repr (op )} "
183215 length = nbytes or len (op .response )
184216 buffer = bytearray (length )
185217 op .assert_response (buffer , 0 , length )
186218 return bytes (buffer )
187219
188220 def readinto (self , buf : circuitpython_typing .WriteableBuffer ) -> int | None :
221+ """A function that mocks :external:py:meth:`busio.UART.readinto()`.
222+ This function checks against `UARTRead`
223+ :py:attr:`~circuitpython_mocks._mixins.Expecting.expectations`"""
189224 assert self .expectations , "no expectation found for UART.readinto()"
190225 op = self .expectations .popleft ()
191- assert isinstance (op , Read ), f"Read operation expected, found { repr (op )} "
226+ assert isinstance (op , UARTRead ), f"Read operation expected, found { repr (op )} "
192227 len_buf = len (op .response )
193228 op .assert_response (buf , 0 , len_buf )
194229 return len_buf
195230
196231 def readline (self ) -> bytes :
232+ """A function that mocks :external:py:meth:`busio.UART.readline()`.
233+ This function checks against `UARTRead`
234+ :py:attr:`~circuitpython_mocks._mixins.Expecting.expectations`"""
197235 assert self .expectations , "no expectation found for UART.readline()"
198236 op = self .expectations .popleft ()
199- assert isinstance (op , Read ), f"Read operation expected, found { repr (op )} "
237+ assert isinstance (op , UARTRead ), f"Read operation expected, found { repr (op )} "
200238 len_buf = len (op .response )
201239 buf = bytearray (len_buf )
202240 op .assert_response (buf , 0 , len_buf )
203241 return bytes (buf )
204242
205243 def write (self , buf : circuitpython_typing .ReadableBuffer ) -> int | None :
244+ """A function that mocks :external:py:meth:`busio.UART.write()`.
245+ This function checks against `UARTWrite`
246+ :py:attr:`~circuitpython_mocks._mixins.Expecting.expectations`"""
206247 assert self .expectations , "no expectation found for UART.write()"
207248 op = self .expectations .popleft ()
208- assert isinstance (op , Write ), f"Read operation expected, found { repr (op )} "
249+ assert isinstance (op , UARTWrite ), f"Read operation expected, found { repr (op )} "
209250 len_buf = len (op .expected )
210251 op .assert_expected (buf , 0 , len_buf )
211252 return len (buf ) or None
0 commit comments