or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

index.md

index.mddocs/

0

# FreezeGun

1

2

FreezeGun is a Python testing library that allows your tests to travel through time by mocking datetime and time functions. It freezes calls to datetime.datetime.now(), datetime.datetime.utcnow(), datetime.date.today(), time.time(), time.localtime(), time.gmtime(), time.strftime(), time.monotonic(), and time.perf_counter() to return consistent, predictable values during test execution.

3

4

## Package Information

5

6

- **Package Name**: freezegun

7

- **Language**: Python

8

- **Installation**: `pip install freezegun`

9

- **Requirements**: Python 3.8+, python-dateutil >= 2.7

10

11

## Core Imports

12

13

```python

14

from freezegun import freeze_time, configure

15

```

16

17

Note: Only `freeze_time` and `configure` are officially exported. Other components can be accessed from internal modules but are not part of the guaranteed public API:

18

19

```python

20

# Internal API access (not guaranteed stable)

21

from freezegun.api import FakeDate, FakeDatetime, get_current_time

22

from freezegun.config import reset_config

23

```

24

25

## Basic Usage

26

27

```python

28

from freezegun import freeze_time

29

import datetime

30

31

# As a decorator

32

@freeze_time("2012-01-14")

33

def test_datetime():

34

assert datetime.datetime.now() == datetime.datetime(2012, 1, 14)

35

36

# As a context manager

37

def test_context_manager():

38

with freeze_time("2012-01-14"):

39

assert datetime.datetime.now() == datetime.datetime(2012, 1, 14)

40

# Time is unfrozen outside the context

41

42

# Manual start/stop

43

def test_manual():

44

freezer = freeze_time("2012-01-14 12:00:01")

45

freezer.start()

46

assert datetime.datetime.now() == datetime.datetime(2012, 1, 14, 12, 0, 1)

47

freezer.stop()

48

```

49

50

## Architecture

51

52

FreezeGun works by monkey-patching Python's time and datetime modules at runtime. It replaces standard time functions with fake implementations that return frozen values, while preserving original functionality for restoration when freezing stops. The library uses three time factory patterns:

53

54

- **FrozenDateTimeFactory**: Returns a static frozen time

55

- **TickingDateTimeFactory**: Time advances with real-world time passage

56

- **StepTickTimeFactory**: Time advances by specified intervals automatically

57

58

This approach ensures comprehensive time mocking across the entire Python environment while maintaining compatibility with existing codebases.

59

60

## Capabilities

61

62

### Time Freezing Decorator/Context Manager

63

64

Main functionality for freezing time during test execution. Can be used as a decorator, context manager, or manually controlled.

65

66

```python { .api }

67

def freeze_time(

68

time_to_freeze: Optional[_Freezable] = None,

69

tz_offset: Union[int, datetime.timedelta] = 0,

70

ignore: Optional[List[str]] = None,

71

tick: bool = False,

72

as_arg: bool = False,

73

as_kwarg: str = '',

74

auto_tick_seconds: float = 0,

75

real_asyncio: bool = False

76

) -> _freeze_time:

77

"""

78

Freezes time for testing purposes.

79

80

Args:

81

time_to_freeze: The datetime to freeze time at (see _Freezable type for supported formats)

82

tz_offset: Timezone offset in hours or timedelta

83

ignore: List of module names to ignore during freezing

84

tick: If True, time advances with real-world time

85

as_arg: Pass time factory as first argument to decorated function

86

as_kwarg: Pass time factory as named keyword argument

87

auto_tick_seconds: Automatically advance time by this interval

88

real_asyncio: Allow asyncio event loops to see real monotonic time

89

90

Returns:

91

_freeze_time: Time freezer instance that can be used as decorator or context manager

92

"""

93

```

94

95

### Freeze Time Context Manager Class

96

97

The class returned by `freeze_time()` that provides context manager and decorator functionality.

98

99

```python { .api }

100

class _freeze_time:

101

"""

102

A class to freeze time for testing purposes.

103

104

This class can be used as a context manager or a decorator to freeze time

105

during the execution of a block of code or a function.

106

"""

107

108

def __init__(

109

self,

110

time_to_freeze_str: Optional[_Freezable],

111

tz_offset: Union[int, datetime.timedelta],

112

ignore: List[str],

113

tick: bool,

114

as_arg: bool,

115

as_kwarg: str,

116

auto_tick_seconds: float,

117

real_asyncio: Optional[bool],

118

): ...

119

120

def start(self) -> Union[StepTickTimeFactory, TickingDateTimeFactory, FrozenDateTimeFactory]:

121

"""

122

Starts freezing time and returns the time factory.

123

124

Returns:

125

Time factory instance for controlling frozen time

126

"""

127

128

def stop(self) -> None:

129

"""Stops freezing time and restores the original time functions."""

130

131

def __enter__(self) -> Union[StepTickTimeFactory, TickingDateTimeFactory, FrozenDateTimeFactory]:

132

"""Context manager entry point. Calls start()."""

133

134

def __exit__(self, *args: Any) -> None:

135

"""Context manager exit point. Calls stop()."""

136

137

def __call__(self, func: Union[Type[T], Callable]) -> Union[Type[T], Callable]:

138

"""

139

Decorator functionality for functions, methods, and classes.

140

141

Args:

142

func: Function, method, or class to decorate

143

144

Returns:

145

Decorated callable with frozen time behavior

146

"""

147

148

def decorate_class(self, klass: Type[T]) -> Type[T]:

149

"""Decorates a class to freeze time during its execution."""

150

151

def decorate_callable(self, func: Callable) -> Callable:

152

"""Decorates a callable to freeze time during its execution."""

153

154

def decorate_coroutine(self, coroutine: Callable) -> Callable:

155

"""Decorates a coroutine to freeze time during its execution."""

156

```

157

158

### Time Factory Classes

159

160

Time factory classes control how frozen time behaves during test execution.

161

162

```python { .api }

163

class FrozenDateTimeFactory:

164

"""Factory for static frozen time that doesn't advance."""

165

166

def __init__(self, time_to_freeze: datetime.datetime): ...

167

168

def __call__(self) -> datetime.datetime:

169

"""Returns the frozen datetime."""

170

171

def tick(self, delta: Union[datetime.timedelta, float] = datetime.timedelta(seconds=1)) -> datetime.datetime:

172

"""

173

Advances frozen time by the specified delta.

174

175

Args:

176

delta: Time delta to advance (timedelta or seconds as float/int)

177

178

Returns:

179

datetime.datetime: New frozen time after advancement

180

"""

181

182

def move_to(self, target_datetime: _Freezable) -> None:

183

"""

184

Moves frozen time to a specific target datetime.

185

186

Args:

187

target_datetime: Target time to move to (see _Freezable type for supported formats)

188

"""

189

190

class TickingDateTimeFactory:

191

"""Factory for time that advances with real-world time passage."""

192

193

def __init__(self, time_to_freeze: datetime.datetime, start: datetime.datetime): ...

194

195

def __call__(self) -> datetime.datetime:

196

"""Returns frozen time plus elapsed real time since start."""

197

198

def tick(self, delta: Union[datetime.timedelta, float] = datetime.timedelta(seconds=1)) -> datetime.datetime:

199

"""Advances the base frozen time by delta."""

200

201

def move_to(self, target_datetime: _Freezable) -> None:

202

"""Moves base frozen time to target, resets real time tracking."""

203

204

class StepTickTimeFactory:

205

"""Factory for time that automatically advances by fixed intervals."""

206

207

def __init__(self, time_to_freeze: datetime.datetime, step_width: float): ...

208

209

def __call__(self) -> datetime.datetime:

210

"""Returns current time and advances by step_width."""

211

212

def tick(self, delta: Optional[Union[datetime.timedelta, float]] = None) -> datetime.datetime:

213

"""

214

Advances time by delta or step_width if delta is None.

215

216

Args:

217

delta: Time to advance (defaults to step_width)

218

219

Returns:

220

datetime.datetime: New time after advancement

221

"""

222

223

def update_step_width(self, step_width: float) -> None:

224

"""

225

Updates the automatic advancement interval.

226

227

Args:

228

step_width: New step width in seconds

229

"""

230

231

def move_to(self, target_datetime: _Freezable) -> None:

232

"""Moves to target datetime."""

233

```

234

235

### Fake Date and DateTime Classes

236

237

Replacement classes for Python's built-in date and datetime that provide frozen behavior.

238

239

```python { .api }

240

class FakeDate:

241

"""Replacement for datetime.date with frozen behavior."""

242

243

def __init__(self, year: int, month: int, day: int): ...

244

245

@classmethod

246

def today(cls) -> 'FakeDate':

247

"""Returns the current frozen date."""

248

249

def __add__(self, other: datetime.timedelta) -> 'FakeDate':

250

"""Add timedelta to date."""

251

252

def __sub__(self, other: Union['FakeDate', datetime.timedelta]) -> Union['FakeDate', datetime.timedelta]:

253

"""Subtract date or timedelta from date."""

254

255

# Class attributes

256

min: 'FakeDate' # Minimum representable date

257

max: 'FakeDate' # Maximum representable date

258

259

class FakeDatetime:

260

"""Replacement for datetime.datetime with frozen behavior."""

261

262

def __init__(self, year: int, month: int, day: int, hour: int = 0, minute: int = 0, second: int = 0, microsecond: int = 0, tzinfo: Optional[datetime.tzinfo] = None): ...

263

264

@classmethod

265

def now(cls, tz: Optional[datetime.tzinfo] = None) -> 'FakeDatetime':

266

"""Returns the current frozen datetime."""

267

268

@classmethod

269

def utcnow(cls) -> 'FakeDatetime':

270

"""Returns the current frozen UTC datetime."""

271

272

@classmethod

273

def today(cls) -> 'FakeDatetime':

274

"""Returns the current frozen date as datetime."""

275

276

@classmethod

277

def fromtimestamp(cls, t: float, tz: Optional[datetime.tzinfo] = None) -> 'FakeDatetime':

278

"""Creates datetime from timestamp using frozen timezone offset."""

279

280

def date(self) -> FakeDate:

281

"""Returns the date portion as FakeDate."""

282

283

def timestamp(self) -> float:

284

"""Returns POSIX timestamp respecting frozen time."""

285

286

def astimezone(self, tz: Optional[datetime.tzinfo] = None) -> 'FakeDatetime':

287

"""Returns timezone-aware datetime."""

288

289

def __add__(self, other: datetime.timedelta) -> 'FakeDatetime':

290

"""Add timedelta to datetime."""

291

292

def __sub__(self, other: Union['FakeDatetime', datetime.timedelta]) -> Union['FakeDatetime', datetime.timedelta]:

293

"""Subtract datetime or timedelta from datetime."""

294

295

@property

296

def nanosecond(self) -> int:

297

"""Nanosecond component (0 if not supported)."""

298

299

# Class attributes

300

min: 'FakeDatetime' # Minimum representable datetime

301

max: 'FakeDatetime' # Maximum representable datetime

302

```

303

304

### Configuration

305

306

Global configuration for FreezeGun behavior across all freeze operations.

307

308

```python { .api }

309

def configure(

310

default_ignore_list: Optional[List[str]] = None,

311

extend_ignore_list: Optional[List[str]] = None

312

) -> None:

313

"""

314

Configure global FreezeGun settings.

315

316

Args:

317

default_ignore_list: Replace default ignore list with these modules

318

extend_ignore_list: Add these modules to default ignore list

319

320

Raises:

321

ConfigurationError: If both parameters are provided

322

"""

323

324

def reset_config() -> None:

325

"""Reset configuration to default settings."""

326

327

class Settings:

328

"""Global settings container."""

329

def __init__(self, default_ignore_list: Optional[List[str]] = None): ...

330

331

default_ignore_list: List[str] # Modules to ignore during freezing

332

333

class ConfigurationError(Exception):

334

"""Raised when configuration parameters conflict."""

335

```

336

337

### Utility Functions

338

339

Helper functions for time manipulation and type conversion.

340

341

```python { .api }

342

def get_current_time() -> datetime.datetime:

343

"""

344

Returns the current frozen time.

345

346

Returns:

347

datetime.datetime: Current frozen datetime

348

349

Raises:

350

IndexError: If no time is currently frozen

351

"""

352

353

def convert_to_timezone_naive(time_to_freeze: datetime.datetime) -> datetime.datetime:

354

"""

355

Converts timezone-aware datetime to naive UTC datetime.

356

357

Args:

358

time_to_freeze: Input datetime (may be timezone-aware)

359

360

Returns:

361

datetime.datetime: Naive UTC datetime

362

"""

363

364

def datetime_to_fakedatetime(datetime: datetime.datetime) -> FakeDatetime:

365

"""

366

Converts standard datetime to FakeDatetime.

367

368

Args:

369

datetime: Standard datetime object

370

371

Returns:

372

FakeDatetime: Equivalent FakeDatetime instance

373

"""

374

375

def date_to_fakedate(date: datetime.date) -> FakeDate:

376

"""

377

Converts standard date to FakeDate.

378

379

Args:

380

date: Standard date object

381

382

Returns:

383

FakeDate: Equivalent FakeDate instance

384

"""

385

```

386

387

### Type Definitions

388

389

```python { .api }

390

from typing import Union, Optional, List, Callable, Iterator, Type, Any

391

import types

392

import datetime

393

394

_Freezable = Union[

395

str, # "2020-01-01", "2020-01-01 12:30:45"

396

datetime.datetime, # Specific datetime object

397

datetime.date, # Date (time set to midnight)

398

datetime.timedelta, # Relative to current time

399

types.FunctionType, # Function returning datetime

400

Callable[[], Union[str, datetime.datetime, datetime.date, datetime.timedelta]], # Callable returning datetime

401

Iterator[datetime.datetime] # Generator yielding datetime values

402

]

403

```

404

405

### Package Metadata

406

407

```python { .api }

408

__version__: str = '1.5.5' # Package version

409

__title__: str = 'freezegun' # Package title

410

__author__: str = 'Steve Pulec' # Package author

411

__license__: str = 'Apache License 2.0' # Package license

412

__copyright__: str = 'Copyright 2012 Steve Pulec' # Copyright notice

413

```

414

415

### Constants

416

417

```python { .api }

418

DEFAULT_IGNORE_LIST: List[str] # Default modules ignored during freezing: [

419

'nose.plugins', 'six.moves', 'django.utils.six.moves', 'google.gax',

420

'threading', 'multiprocessing', 'queue', 'selenium', '_pytest.terminal.',

421

'_pytest.runner.', 'gi', 'prompt_toolkit'

422

]

423

424

settings: Settings # Global settings instance

425

```

426

427

## Usage Examples

428

429

### Advanced Time Control

430

431

```python

432

from freezegun import freeze_time

433

import datetime

434

435

# Ticking time - advances with real time

436

@freeze_time("2020-01-01", tick=True)

437

def test_ticking():

438

start = datetime.datetime.now()

439

time.sleep(1)

440

end = datetime.datetime.now()

441

assert end > start # Time has advanced

442

443

# Auto-tick time - advances automatically

444

@freeze_time("2020-01-01", auto_tick_seconds=1)

445

def test_auto_tick():

446

time1 = datetime.datetime.now()

447

time2 = datetime.datetime.now()

448

# time2 is 1 second after time1

449

450

# Manual time control

451

with freeze_time("2020-01-01") as frozen_time:

452

assert datetime.datetime.now() == datetime.datetime(2020, 1, 1)

453

454

# Advance time manually

455

frozen_time.tick(delta=datetime.timedelta(days=1))

456

assert datetime.datetime.now() == datetime.datetime(2020, 1, 2)

457

458

# Jump to specific time

459

frozen_time.move_to("2020-06-15 14:30:00")

460

assert datetime.datetime.now() == datetime.datetime(2020, 6, 15, 14, 30)

461

```

462

463

### Timezone Handling

464

465

```python

466

from freezegun import freeze_time

467

import datetime

468

469

# Timezone offset

470

@freeze_time("2020-01-01 12:00:00", tz_offset=-5)

471

def test_timezone():

472

# UTC time is frozen at 12:00:00

473

assert datetime.datetime.utcnow() == datetime.datetime(2020, 1, 1, 12, 0, 0)

474

# Local time shows 07:00:00 (UTC-5)

475

assert datetime.datetime.now() == datetime.datetime(2020, 1, 1, 7, 0, 0)

476

477

# Using timedelta for offset

478

@freeze_time("2020-01-01", tz_offset=datetime.timedelta(hours=3))

479

def test_timedelta_offset():

480

# Local time is 3 hours ahead of UTC

481

pass

482

```

483

484

### Class and Method Decoration

485

486

```python

487

from freezegun import freeze_time

488

import unittest

489

import datetime

490

491

# Class decorator - freezes for all test methods

492

@freeze_time("2020-01-01")

493

class TestTimeTravel(unittest.TestCase):

494

def test_method_one(self):

495

assert datetime.datetime.now().year == 2020

496

497

def test_method_two(self):

498

assert datetime.datetime.now().month == 1

499

500

# Method decorator with time factory injection

501

class TestWithFactory(unittest.TestCase):

502

@freeze_time("2020-01-01", as_kwarg='frozen_time')

503

def test_with_factory_kwarg(self, frozen_time):

504

assert datetime.datetime.now() == datetime.datetime(2020, 1, 1)

505

506

# Use the factory to control time

507

frozen_time.tick(datetime.timedelta(days=5))

508

assert datetime.datetime.now() == datetime.datetime(2020, 1, 6)

509

510

@freeze_time("2020-01-01", as_arg=True)

511

def test_with_factory_arg(self, frozen_time):

512

# frozen_time is passed as first argument

513

frozen_time.move_to("2020-12-31")

514

assert datetime.datetime.now().month == 12

515

```

516

517

### Configuration and Module Ignoring

518

519

```python

520

from freezegun import freeze_time, configure

521

522

# Configure globally

523

configure(extend_ignore_list=['my_module', 'another_module'])

524

525

# Or per freeze operation

526

@freeze_time("2020-01-01", ignore=['requests', 'urllib3'])

527

def test_with_ignored_modules():

528

# Time is frozen except in requests and urllib3 modules

529

pass

530

531

# Reset configuration

532

from freezegun.config import reset_config

533

reset_config()

534

```

535

536

### Dynamic Time Generation

537

538

```python

539

from freezegun import freeze_time

540

import datetime

541

542

# Using a function

543

def get_test_time():

544

return datetime.datetime(2020, 6, 15, 10, 30, 0)

545

546

@freeze_time(get_test_time)

547

def test_function_time():

548

assert datetime.datetime.now() == datetime.datetime(2020, 6, 15, 10, 30, 0)

549

550

# Using a generator

551

def time_generator():

552

base = datetime.datetime(2020, 1, 1)

553

for i in range(10):

554

yield base + datetime.timedelta(days=i)

555

556

time_gen = time_generator()

557

558

@freeze_time(time_gen)

559

def test_generator_time():

560

# Uses next value from generator

561

pass

562

```