Skip to content

Commit 9849cfb

Browse files
authored
feat: add Perl and R test elements to schema and model (#59)
1 parent 29d68ae commit 9849cfb

File tree

3 files changed

+248
-5
lines changed

3 files changed

+248
-5
lines changed

conda_recipe_v2_schema/model.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,26 @@ class PythonTestElement(StrictBaseModel):
473473
python: PythonTestElementInner = Field(..., description="Python specific test configuration")
474474

475475

476+
class PerlTestElementInner(StrictBaseModel):
477+
uses: ConditionalList[NonEmptyStr] = Field(
478+
..., description="A list of Perl modules to check after having installed the built package."
479+
)
480+
481+
482+
class PerlTestElement(StrictBaseModel):
483+
perl: PerlTestElementInner = Field(..., description="Perl specific test configuration")
484+
485+
486+
class RTestElementInner(StrictBaseModel):
487+
libraries: ConditionalList[NonEmptyStr] = Field(
488+
..., description="A list of R libraries to check after having installed the built package."
489+
)
490+
491+
492+
class RTestElement(StrictBaseModel):
493+
r: RTestElementInner = Field(..., description="R specific test configuration")
494+
495+
476496
class DownstreamTestElement(StrictBaseModel):
477497
downstream: MatchSpec = Field(
478498
...,
@@ -508,7 +528,14 @@ class PackageContentTest(StrictBaseModel):
508528
)
509529

510530

511-
TestElement = ScriptTestElement | PythonTestElement | DownstreamTestElement | PackageContentTest
531+
TestElement = (
532+
ScriptTestElement
533+
| PythonTestElement
534+
| PerlTestElement
535+
| RTestElement
536+
| DownstreamTestElement
537+
| PackageContentTest
538+
)
512539

513540
#########
514541
# About #

schema.json

Lines changed: 162 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1858,7 +1858,7 @@
18581858
"title": "IfStatement[Annotated[str, StringConstraints]]",
18591859
"type": "object"
18601860
},
1861-
"IfStatement_Union_ScriptTestElement__PythonTestElement__DownstreamTestElement__PackageContentTest__": {
1861+
"IfStatement_Union_ScriptTestElement__PythonTestElement__PerlTestElement__RTestElement__DownstreamTestElement__PackageContentTest__": {
18621862
"additionalProperties": false,
18631863
"properties": {
18641864
"if": {
@@ -1873,6 +1873,12 @@
18731873
{
18741874
"$ref": "#/$defs/PythonTestElement"
18751875
},
1876+
{
1877+
"$ref": "#/$defs/PerlTestElement"
1878+
},
1879+
{
1880+
"$ref": "#/$defs/RTestElement"
1881+
},
18761882
{
18771883
"$ref": "#/$defs/DownstreamTestElement"
18781884
},
@@ -1888,6 +1894,12 @@
18881894
{
18891895
"$ref": "#/$defs/PythonTestElement"
18901896
},
1897+
{
1898+
"$ref": "#/$defs/PerlTestElement"
1899+
},
1900+
{
1901+
"$ref": "#/$defs/RTestElement"
1902+
},
18911903
{
18921904
"$ref": "#/$defs/DownstreamTestElement"
18931905
},
@@ -1909,6 +1921,12 @@
19091921
{
19101922
"$ref": "#/$defs/PythonTestElement"
19111923
},
1924+
{
1925+
"$ref": "#/$defs/PerlTestElement"
1926+
},
1927+
{
1928+
"$ref": "#/$defs/RTestElement"
1929+
},
19121930
{
19131931
"$ref": "#/$defs/DownstreamTestElement"
19141932
},
@@ -1924,6 +1942,12 @@
19241942
{
19251943
"$ref": "#/$defs/PythonTestElement"
19261944
},
1945+
{
1946+
"$ref": "#/$defs/PerlTestElement"
1947+
},
1948+
{
1949+
"$ref": "#/$defs/RTestElement"
1950+
},
19271951
{
19281952
"$ref": "#/$defs/DownstreamTestElement"
19291953
},
@@ -1946,7 +1970,7 @@
19461970
"if",
19471971
"then"
19481972
],
1949-
"title": "IfStatement[Union[ScriptTestElement, PythonTestElement, DownstreamTestElement, PackageContentTest]]",
1973+
"title": "IfStatement[Union[ScriptTestElement, PythonTestElement, PerlTestElement, RTestElement, DownstreamTestElement, PackageContentTest]]",
19501974
"type": "object"
19511975
},
19521976
"IfStatement_Union_UrlSource__GitRev__GitTag__GitBranch__BaseGitSource__LocalSource__": {
@@ -2430,14 +2454,20 @@
24302454
{
24312455
"$ref": "#/$defs/PythonTestElement"
24322456
},
2457+
{
2458+
"$ref": "#/$defs/PerlTestElement"
2459+
},
2460+
{
2461+
"$ref": "#/$defs/RTestElement"
2462+
},
24332463
{
24342464
"$ref": "#/$defs/DownstreamTestElement"
24352465
},
24362466
{
24372467
"$ref": "#/$defs/PackageContentTest"
24382468
},
24392469
{
2440-
"$ref": "#/$defs/IfStatement_Union_ScriptTestElement__PythonTestElement__DownstreamTestElement__PackageContentTest__"
2470+
"$ref": "#/$defs/IfStatement_Union_ScriptTestElement__PythonTestElement__PerlTestElement__RTestElement__DownstreamTestElement__PackageContentTest__"
24412471
},
24422472
{
24432473
"items": {
@@ -2448,14 +2478,20 @@
24482478
{
24492479
"$ref": "#/$defs/PythonTestElement"
24502480
},
2481+
{
2482+
"$ref": "#/$defs/PerlTestElement"
2483+
},
2484+
{
2485+
"$ref": "#/$defs/RTestElement"
2486+
},
24512487
{
24522488
"$ref": "#/$defs/DownstreamTestElement"
24532489
},
24542490
{
24552491
"$ref": "#/$defs/PackageContentTest"
24562492
},
24572493
{
2458-
"$ref": "#/$defs/IfStatement_Union_ScriptTestElement__PythonTestElement__DownstreamTestElement__PackageContentTest__"
2494+
"$ref": "#/$defs/IfStatement_Union_ScriptTestElement__PythonTestElement__PerlTestElement__RTestElement__DownstreamTestElement__PackageContentTest__"
24592495
}
24602496
]
24612497
},
@@ -3045,6 +3081,61 @@
30453081
"title": "PackageContentTestInner",
30463082
"type": "object"
30473083
},
3084+
"PerlTestElement": {
3085+
"additionalProperties": false,
3086+
"properties": {
3087+
"perl": {
3088+
"allOf": [
3089+
{
3090+
"$ref": "#/$defs/PerlTestElementInner"
3091+
}
3092+
],
3093+
"description": "Perl specific test configuration"
3094+
}
3095+
},
3096+
"required": [
3097+
"perl"
3098+
],
3099+
"title": "PerlTestElement",
3100+
"type": "object"
3101+
},
3102+
"PerlTestElementInner": {
3103+
"additionalProperties": false,
3104+
"properties": {
3105+
"uses": {
3106+
"anyOf": [
3107+
{
3108+
"minLength": 1,
3109+
"type": "string"
3110+
},
3111+
{
3112+
"$ref": "#/$defs/IfStatement"
3113+
},
3114+
{
3115+
"items": {
3116+
"anyOf": [
3117+
{
3118+
"minLength": 1,
3119+
"type": "string"
3120+
},
3121+
{
3122+
"$ref": "#/$defs/IfStatement"
3123+
}
3124+
]
3125+
},
3126+
"type": "array"
3127+
}
3128+
],
3129+
"description": "A list of Perl modules to check after having installed the built package.",
3130+
"title": "Uses"
3131+
}
3132+
},
3133+
"required": [
3134+
"uses"
3135+
],
3136+
"title": "PerlTestElementInner",
3137+
"type": "object"
3138+
},
30483139
"PrefixDetection": {
30493140
"additionalProperties": false,
30503141
"properties": {
@@ -3379,6 +3470,61 @@
33793470
"title": "PythonTestElementInner",
33803471
"type": "object"
33813472
},
3473+
"RTestElement": {
3474+
"additionalProperties": false,
3475+
"properties": {
3476+
"r": {
3477+
"allOf": [
3478+
{
3479+
"$ref": "#/$defs/RTestElementInner"
3480+
}
3481+
],
3482+
"description": "R specific test configuration"
3483+
}
3484+
},
3485+
"required": [
3486+
"r"
3487+
],
3488+
"title": "RTestElement",
3489+
"type": "object"
3490+
},
3491+
"RTestElementInner": {
3492+
"additionalProperties": false,
3493+
"properties": {
3494+
"libraries": {
3495+
"anyOf": [
3496+
{
3497+
"minLength": 1,
3498+
"type": "string"
3499+
},
3500+
{
3501+
"$ref": "#/$defs/IfStatement"
3502+
},
3503+
{
3504+
"items": {
3505+
"anyOf": [
3506+
{
3507+
"minLength": 1,
3508+
"type": "string"
3509+
},
3510+
{
3511+
"$ref": "#/$defs/IfStatement"
3512+
}
3513+
]
3514+
},
3515+
"type": "array"
3516+
}
3517+
],
3518+
"description": "A list of R libraries to check after having installed the built package.",
3519+
"title": "Libraries"
3520+
}
3521+
},
3522+
"required": [
3523+
"libraries"
3524+
],
3525+
"title": "RTestElementInner",
3526+
"type": "object"
3527+
},
33823528
"Requirements": {
33833529
"additionalProperties": false,
33843530
"properties": {
@@ -3920,6 +4066,12 @@
39204066
{
39214067
"$ref": "#/$defs/PythonTestElement"
39224068
},
4069+
{
4070+
"$ref": "#/$defs/PerlTestElement"
4071+
},
4072+
{
4073+
"$ref": "#/$defs/RTestElement"
4074+
},
39234075
{
39244076
"$ref": "#/$defs/DownstreamTestElement"
39254077
},
@@ -3938,6 +4090,12 @@
39384090
{
39394091
"$ref": "#/$defs/PythonTestElement"
39404092
},
4093+
{
4094+
"$ref": "#/$defs/PerlTestElement"
4095+
},
4096+
{
4097+
"$ref": "#/$defs/RTestElement"
4098+
},
39414099
{
39424100
"$ref": "#/$defs/DownstreamTestElement"
39434101
},

tests/test_recipy.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,61 @@ def test_patches_invalid_conditional():
9090
# This should raise a validation error
9191
with pytest.raises(PydanticValidationError):
9292
Recipe.validate_python(recipe_dict)
93+
94+
95+
def test_perl_test_valid():
96+
"""Test that recipes with a Perl test pass validation."""
97+
recipe_yaml = """
98+
package:
99+
name: test
100+
version: 1.0.0
101+
tests:
102+
- perl:
103+
uses:
104+
- Call::Context
105+
"""
106+
recipe_dict = yaml.safe_load(recipe_yaml)
107+
Recipe.validate_python(recipe_dict)
108+
109+
110+
def test_perl_test_invalid_missing_uses():
111+
"""Test that a Perl test without uses fails validation."""
112+
recipe_yaml = """
113+
package:
114+
name: test
115+
version: 1.0.0
116+
tests:
117+
- perl: {}
118+
"""
119+
recipe_dict = yaml.safe_load(recipe_yaml)
120+
with pytest.raises(PydanticValidationError):
121+
Recipe.validate_python(recipe_dict)
122+
123+
124+
def test_r_test_valid():
125+
"""Test that recipes with an R test pass validation."""
126+
recipe_yaml = """
127+
package:
128+
name: test
129+
version: 1.0.0
130+
tests:
131+
- r:
132+
libraries:
133+
- ggplot2
134+
"""
135+
recipe_dict = yaml.safe_load(recipe_yaml)
136+
Recipe.validate_python(recipe_dict)
137+
138+
139+
def test_r_test_invalid_missing_libraries():
140+
"""Test that an R test without libraries fails validation."""
141+
recipe_yaml = """
142+
package:
143+
name: test
144+
version: 1.0.0
145+
tests:
146+
- r: {}
147+
"""
148+
recipe_dict = yaml.safe_load(recipe_yaml)
149+
with pytest.raises(PydanticValidationError):
150+
Recipe.validate_python(recipe_dict)

0 commit comments

Comments
 (0)