Coverage for src / competitive_verifier / oj / languages / __init__.py: 100%

48 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-06-05 08:59 +0900

1import importlib 

2import sys 

3from collections.abc import Callable 

4from typing import Any, BinaryIO, Protocol, cast 

5 

6from pydantic import BaseModel, ConfigDict, Field 

7 

8from .base import ( 

9 Language, 

10 LanguageEnvironment, 

11 OjVerifyLanguageConfig, 

12 OjVerifyUserDefinedConfig, 

13) 

14from .cplusplus import ( 

15 CPlusPlusLanguage, 

16 OjVerifyCPlusPlusConfig, 

17) 

18from .go import GoLanguage, OjVerifyGoConfig 

19from .haskell import ( 

20 HaskellLanguage, 

21 OjVerifyHaskellConfig, 

22) 

23from .java import ( 

24 JavaLanguage, 

25 OjVerifyJavaConfig, 

26) 

27from .nim import NimLanguage, OjVerifyNimConfig 

28from .python import PythonLanguage 

29from .ruby import ( 

30 OjVerifyRubyConfig, 

31 RubyLanguage, 

32) 

33from .rust import ( 

34 OjVerifyRustConfig, 

35 OjVerifyRustListDependenciesBackend, 

36 RustLanguage, 

37) 

38from .user_defined import UserDefinedLanguage 

39 

40 

41class _TomlModule(Protocol): 

42 def load( 

43 self, fp: BinaryIO, /, *, parse_float: Callable[[str], Any] = float 

44 ) -> dict[str, Any]: ... 

45 

46 

47if sys.version_info >= (3, 11): # pragma: no cover 

48 import tomllib 

49 

50 _tomli = cast("_TomlModule", tomllib) 

51else: # pragma: no cover 

52 _tomli = cast("_TomlModule", importlib.import_module("tomli")) 

53 

54 

55class OjVerifyLanguageConfigDict(BaseModel): 

56 model_config = ConfigDict(extra="allow") 

57 __pydantic_extra__: dict[str, OjVerifyUserDefinedConfig] = Field( # pyright: ignore[reportIncompatibleVariableOverride] 

58 default_factory=dict[str, OjVerifyUserDefinedConfig] 

59 ) 

60 

61 cpp: OjVerifyCPlusPlusConfig = Field(default_factory=OjVerifyCPlusPlusConfig) 

62 go: OjVerifyGoConfig = Field(default_factory=OjVerifyGoConfig) 

63 haskell: OjVerifyHaskellConfig = Field(default_factory=OjVerifyHaskellConfig) 

64 java: OjVerifyJavaConfig = Field(default_factory=OjVerifyJavaConfig) 

65 nim: OjVerifyNimConfig = Field(default_factory=OjVerifyNimConfig) 

66 ruby: OjVerifyRubyConfig = Field(default_factory=OjVerifyRubyConfig) 

67 rust: OjVerifyRustConfig = Field(default_factory=OjVerifyRustConfig) 

68 

69 

70class VerificationConfig(BaseModel): 

71 languages: OjVerifyLanguageConfigDict = Field( 

72 default_factory=OjVerifyLanguageConfigDict, 

73 ) 

74 

75 @classmethod 

76 def load(cls, fp: BinaryIO) -> "VerificationConfig": 

77 return VerificationConfig.model_validate(_tomli.load(fp)) 

78 

79 def get_dict(self) -> dict[str, Language]: 

80 languages = self.languages 

81 d: dict[str, Language] = {} 

82 d[".cpp"] = CPlusPlusLanguage(config=languages.cpp) 

83 d[".hpp"] = d[".cpp"] 

84 d[".cc"] = d[".cpp"] 

85 d[".h"] = d[".cpp"] 

86 d[".nim"] = NimLanguage(config=languages.nim) 

87 d[".py"] = PythonLanguage() 

88 d[".hs"] = HaskellLanguage(config=languages.haskell) 

89 d[".ruby"] = RubyLanguage(config=languages.ruby) 

90 d[".go"] = GoLanguage(config=languages.go) 

91 d[".java"] = JavaLanguage(config=languages.java) 

92 d[".rs"] = RustLanguage(config=languages.rust) 

93 

94 for ext, lang_config in languages.__pydantic_extra__.items(): 

95 d["." + ext] = UserDefinedLanguage(extension=ext, config=lang_config) 

96 

97 return d 

98 

99 

100__all__ = [ 

101 "CPlusPlusLanguage", 

102 "GoLanguage", 

103 "HaskellLanguage", 

104 "JavaLanguage", 

105 "Language", 

106 "LanguageEnvironment", 

107 "NimLanguage", 

108 "OjVerifyCPlusPlusConfig", 

109 "OjVerifyGoConfig", 

110 "OjVerifyHaskellConfig", 

111 "OjVerifyJavaConfig", 

112 "OjVerifyLanguageConfig", 

113 "OjVerifyNimConfig", 

114 "OjVerifyRubyConfig", 

115 "OjVerifyRustConfig", 

116 "OjVerifyRustListDependenciesBackend", 

117 "OjVerifyUserDefinedConfig", 

118 "PythonLanguage", 

119 "RubyLanguage", 

120 "RustLanguage", 

121 "UserDefinedLanguage", 

122 "VerificationConfig", 

123]