9
9
import configparser
10
10
import datetime
11
11
import os
12
- import tarfile
13
12
import warnings
14
13
from pathlib import Path
15
14
from typing import Any , Dict , Generator , List , Type
35
34
36
35
from ..shared .helpers import get_spec_format_for_item , labeled_format_parameter_set
37
36
from ..spec_version_checker .spec_version_checker import get_ref_spec_from_module
37
+ from .fixture_output import FixtureOutput
38
38
39
39
40
40
def default_output_directory () -> str :
@@ -53,18 +53,6 @@ def default_html_report_file_path() -> str:
53
53
return ".meta/report_fill.html"
54
54
55
55
56
- def strip_output_tarball_suffix (output : Path ) -> Path :
57
- """Strip the '.tar.gz' suffix from the output path."""
58
- if str (output ).endswith (".tar.gz" ):
59
- return output .with_suffix ("" ).with_suffix ("" )
60
- return output
61
-
62
-
63
- def is_output_stdout (output : Path ) -> bool :
64
- """Return True if the fixture output is configured to be stdout."""
65
- return strip_output_tarball_suffix (output ).name == "stdout"
66
-
67
-
68
56
def pytest_addoption (parser : pytest .Parser ):
69
57
"""Add command-line options to pytest."""
70
58
evm_group = parser .getgroup ("evm" , "Arguments defining evm executable behavior" )
@@ -229,12 +217,14 @@ def pytest_configure(config):
229
217
EnvironmentDefaults .gas_limit = config .getoption ("block_gas_limit" )
230
218
if config .option .collectonly :
231
219
return
220
+
221
+ # Initialize fixture output configuration
222
+ config .fixture_output = FixtureOutput .from_config (config )
223
+
232
224
if not config .getoption ("disable_html" ) and config .getoption ("htmlpath" ) is None :
233
225
# generate an html report by default, unless explicitly disabled
234
- config .option .htmlpath = (
235
- strip_output_tarball_suffix (config .getoption ("output" ))
236
- / default_html_report_file_path ()
237
- )
226
+ config .option .htmlpath = config .fixture_output .directory / default_html_report_file_path ()
227
+
238
228
# Instantiate the transition tool here to check that the binary path/trace option is valid.
239
229
# This ensures we only raise an error once, if appropriate, instead of for every test.
240
230
t8n = TransitionTool .from_binary_path (
@@ -288,7 +278,7 @@ def pytest_report_teststatus(report, config: pytest.Config):
288
278
...x...
289
279
```
290
280
"""
291
- if is_output_stdout ( config .getoption ( "output" )):
281
+ if config .fixture_output . is_stdout : # type: ignore[attr-defined]
292
282
return report .outcome , "" , report .outcome .upper ()
293
283
294
284
@@ -303,12 +293,12 @@ def pytest_terminal_summary(
303
293
actually run the tests.
304
294
"""
305
295
yield
306
- if is_output_stdout ( config .getoption ( "output" )):
296
+ if config .fixture_output . is_stdout : # type: ignore[attr-defined]
307
297
return
308
298
stats = terminalreporter .stats
309
299
if "passed" in stats and stats ["passed" ]:
310
300
# append / to indicate this is a directory
311
- output_dir = str (strip_output_tarball_suffix ( config .getoption ( "output" ))) + "/"
301
+ output_dir = str (config .fixture_output . directory ) + "/" # type: ignore[attr-defined]
312
302
terminalreporter .write_sep (
313
303
"=" ,
314
304
(
@@ -505,45 +495,33 @@ def base_dump_dir(request: pytest.FixtureRequest) -> Path | None:
505
495
506
496
507
497
@pytest .fixture (scope = "session" )
508
- def is_output_tarball (request : pytest .FixtureRequest ) -> bool :
509
- """Return True if the output directory is a tarball."""
510
- output : Path = request .config .getoption ("output" )
511
- if output .suffix == ".gz" and output .with_suffix ("" ).suffix == ".tar" :
512
- return True
513
- return False
498
+ def fixture_output (request : pytest .FixtureRequest ) -> FixtureOutput :
499
+ """Return the fixture output configuration."""
500
+ return request .config .fixture_output # type: ignore[attr-defined]
514
501
515
502
516
503
@pytest .fixture (scope = "session" )
517
- def output_dir (request : pytest .FixtureRequest , is_output_tarball : bool ) -> Path :
518
- """Return directory to store the generated test fixtures."""
519
- output = request .config .getoption ("output" )
520
- if is_output_tarball :
521
- return strip_output_tarball_suffix (output )
522
- return output
504
+ def is_output_tarball (fixture_output : FixtureOutput ) -> bool :
505
+ """Return True if the output directory is a tarball."""
506
+ return fixture_output .is_tarball
523
507
524
508
525
509
@pytest .fixture (scope = "session" )
526
- def output_metadata_dir (output_dir : Path ) -> Path :
527
- """Return metadata directory to store fixture meta files."""
528
- if is_output_stdout (output_dir ):
529
- return output_dir
530
- return output_dir / ".meta"
510
+ def output_dir (fixture_output : FixtureOutput ) -> Path :
511
+ """Return directory to store the generated test fixtures."""
512
+ return fixture_output .directory
531
513
532
514
533
515
@pytest .fixture (scope = "session" , autouse = True )
534
- def create_properties_file (
535
- request : pytest .FixtureRequest , output_dir : Path , output_metadata_dir : Path
536
- ) -> None :
516
+ def create_properties_file (request : pytest .FixtureRequest , fixture_output : FixtureOutput ) -> None :
537
517
"""
538
518
Create ini file with fixture build properties in the fixture output
539
519
directory.
540
520
"""
541
- if is_output_stdout ( request . config . getoption ( "output" )) :
521
+ if fixture_output . is_stdout :
542
522
return
543
- if not output_dir .exists ():
544
- output_dir .mkdir (parents = True )
545
- if not output_metadata_dir .exists ():
546
- output_metadata_dir .mkdir (parents = True )
523
+
524
+ fixture_output .create_directories ()
547
525
548
526
fixture_properties = {
549
527
"timestamp" : datetime .datetime .now ().isoformat (),
@@ -574,7 +552,7 @@ def create_properties_file(
574
552
)
575
553
config ["environment" ] = environment_properties
576
554
577
- ini_filename = output_metadata_dir / "fixtures.ini"
555
+ ini_filename = fixture_output . metadata_dir / "fixtures.ini"
578
556
with open (ini_filename , "w" ) as f :
579
557
f .write ("; This file describes fixture build properties\n \n " )
580
558
config .write (f )
@@ -610,9 +588,9 @@ def get_fixture_collection_scope(fixture_name, config):
610
588
611
589
See: https://docs.pytest.org/en/stable/how-to/fixtures.html#dynamic-scope
612
590
"""
613
- if is_output_stdout ( config .getoption ( "output" )) :
591
+ if config .fixture_output . is_stdout :
614
592
return "session"
615
- if config .getoption ( " single_fixture_per_file" ) :
593
+ if config .fixture_output . single_fixture_per_file :
616
594
return "function"
617
595
return "module"
618
596
@@ -636,17 +614,17 @@ def fixture_collector(
636
614
evm_fixture_verification : FixtureConsumer ,
637
615
filler_path : Path ,
638
616
base_dump_dir : Path | None ,
639
- output_dir : Path ,
617
+ fixture_output : FixtureOutput ,
640
618
) -> Generator [FixtureCollector , None , None ]:
641
619
"""
642
620
Return configured fixture collector instance used for all tests
643
621
in one test module.
644
622
"""
645
623
fixture_collector = FixtureCollector (
646
- output_dir = output_dir ,
647
- flat_output = request . config . getoption ( " flat_output" ) ,
624
+ output_dir = fixture_output . directory ,
625
+ flat_output = fixture_output . flat_output ,
648
626
fill_static_tests = request .config .getoption ("fill_static_tests_enabled" ),
649
- single_fixture_per_file = request . config . getoption ( " single_fixture_per_file" ) ,
627
+ single_fixture_per_file = fixture_output . single_fixture_per_file ,
650
628
filler_path = filler_path ,
651
629
base_dump_dir = base_dump_dir ,
652
630
)
@@ -875,29 +853,20 @@ def pytest_sessionfinish(session: pytest.Session, exitstatus: int):
875
853
if xdist .is_xdist_worker (session ):
876
854
return
877
855
878
- output : Path = session .config .getoption ( "output" )
856
+ fixture_output = session .config .fixture_output # type: ignore[attr-defined]
879
857
# When using --collect-only it should not matter whether fixtures folder exists or not
880
- if is_output_stdout ( output ) or session .config .option .collectonly :
858
+ if fixture_output . is_stdout or session .config .option .collectonly :
881
859
return
882
860
883
- output_dir = strip_output_tarball_suffix (output )
884
861
# Remove any lock files that may have been created.
885
- for file in output_dir .rglob ("*.lock" ):
862
+ for file in fixture_output . directory .rglob ("*.lock" ):
886
863
file .unlink ()
887
864
888
865
# Generate index file for all produced fixtures.
889
866
if session .config .getoption ("generate_index" ):
890
867
generate_fixtures_index (
891
- output_dir , quiet_mode = True , force_flag = False , disable_infer_format = False
868
+ fixture_output . directory , quiet_mode = True , force_flag = False , disable_infer_format = False
892
869
)
893
870
894
871
# Create tarball of the output directory if the output is a tarball.
895
- is_output_tarball = output .suffix == ".gz" and output .with_suffix ("" ).suffix == ".tar"
896
- if is_output_tarball :
897
- source_dir = output_dir
898
- tarball_filename = output
899
- with tarfile .open (tarball_filename , "w:gz" ) as tar :
900
- for file in source_dir .rglob ("*" ):
901
- if file .suffix in {".json" , ".ini" }:
902
- arcname = Path ("fixtures" ) / file .relative_to (source_dir )
903
- tar .add (file , arcname = arcname )
872
+ fixture_output .create_tarball ()
0 commit comments