Skip to content

Commit de84f91

Browse files
nicolas-gauthier-sonarsourcesonartech
authored andcommitted
SONARPY-3292 Implement support for openai agents in S7693 (#558)
GitOrigin-RevId: 942be5e947afddea89951b9d0bb49863450ce7e8
1 parent b036a73 commit de84f91

63 files changed

Lines changed: 1851 additions & 2153 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

python-checks/src/main/java/org/sonar/python/checks/utils/CheckUtils.java

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import static org.sonar.plugins.python.api.tree.Tree.Kind.DICTIONARY_LITERAL;
4747
import static org.sonar.plugins.python.api.tree.Tree.Kind.GENERATOR_EXPR;
4848
import static org.sonar.plugins.python.api.tree.Tree.Kind.LAMBDA;
49+
import static org.sonar.plugins.python.api.tree.Tree.Kind.LIST_LITERAL;
4950
import static org.sonar.plugins.python.api.tree.Tree.Kind.NAME;
5051
import static org.sonar.plugins.python.api.tree.Tree.Kind.NONE;
5152
import static org.sonar.plugins.python.api.tree.Tree.Kind.NUMERIC_LITERAL;
@@ -132,27 +133,25 @@ public static boolean hasStringLiteralValue(Expression expression, String value)
132133
.isPresent();
133134
}
134135

135-
public static Optional<StringLiteral> extractStringLiteral(Tree tree) {
136-
if (tree.is(STRING_LITERAL)) {
137-
return Optional.of((StringLiteral) tree);
138-
}
139-
if (tree.is(NAME)) {
140-
Expression assignedValue = Expressions.singleAssignedValue(((Name) tree));
141-
if (assignedValue != null && assignedValue.is(STRING_LITERAL)) {
142-
return Optional.of((StringLiteral) assignedValue);
143-
}
144-
}
145-
return Optional.empty();
136+
public static Optional<DictionaryLiteral> extractDict(Tree tree) {
137+
return extract(DICTIONARY_LITERAL, tree);
146138
}
147139

148-
public static Optional<DictionaryLiteral> extractDict(Tree tree) {
149-
if (tree.is(DICTIONARY_LITERAL)) {
150-
return Optional.of((DictionaryLiteral) tree);
140+
public static Optional<ListLiteral> extractList(Tree tree) {
141+
return extract(LIST_LITERAL, tree);
142+
}
143+
144+
public static Optional<StringLiteral> extractStringLiteral(Tree tree) {
145+
return extract(STRING_LITERAL, tree);
146+
}
147+
public static <T> Optional<T> extract(Tree.Kind kind, Tree tree) {
148+
if (tree.is(kind)) {
149+
return Optional.of((T) tree);
151150
}
152151
if (tree.is(NAME)) {
153152
Expression assignedValue = Expressions.singleAssignedValue(((Name) tree));
154-
if (assignedValue != null && assignedValue.is(DICTIONARY_LITERAL)) {
155-
return Optional.of((DictionaryLiteral) assignedValue);
153+
if (assignedValue != null && assignedValue.is(kind)) {
154+
return Optional.of((T) assignedValue);
156155
}
157156
}
158157
return Optional.empty();

python-checks/src/test/java/org/sonar/python/checks/utils/CheckUtilsTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,27 @@ void extractDictTest() {
215215
});
216216
}
217217

218+
@Test
219+
void extractListTest() {
220+
var fileInput = parseFileWithSymbols("src/test/resources/checks/checkUtils/extractListTest.py");
221+
List<Statement> statements = fileInput.statements().statements();
222+
assertThat(statements.get(0)).isInstanceOfSatisfying(AssignmentStatement.class, expressionStatement -> {
223+
assertThat(CheckUtils.extractList(expressionStatement.assignedValue())).isPresent();
224+
});
225+
assertThat(statements.get(1)).isInstanceOfSatisfying(ExpressionStatement.class, expressionStatement -> {
226+
assertThat(CheckUtils.extractList(expressionStatement.expressions().get(0))).isPresent();
227+
});
228+
assertThat(statements.get(2)).isInstanceOfSatisfying(ExpressionStatement.class, expressionStatement -> {
229+
assertThat(CheckUtils.extractList(expressionStatement.expressions().get(0))).isEmpty();
230+
});
231+
assertThat(statements.get(3)).isInstanceOfSatisfying(AssignmentStatement.class, expressionStatement -> {
232+
assertThat(CheckUtils.extractList(expressionStatement.assignedValue())).isEmpty();
233+
});
234+
assertThat(statements.get(4)).isInstanceOfSatisfying(ExpressionStatement.class, expressionStatement -> {
235+
assertThat(CheckUtils.extractList(expressionStatement.expressions().get(0))).isEmpty();
236+
});
237+
}
238+
218239
@Test
219240
void isAbstractTest() throws IOException {
220241
var fileInput = parseFile("src/test/resources/checks/checkUtils/isAbstractTest.py");
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
myList = ["one", "two"]
2+
myList
3+
unknownList
4+
notList = 1
5+
notList

python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/agents.agent.protobuf

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
2+
agents.agent�
3+
Agentagents.agent.Agent"*SonarPythonAnalyzerFakeStub.CustomStubBaser�
4+
handoffsagents.agent.Agent.handoffs�
5+
@builtins.list[Union[agents.agent.Agent,agents.handoffs.Handoff]]�
6+
1Union[agents.agent.Agent,agents.handoffs.Handoff](
7+
agents.agent.Agent"agents.agent.Agent2
8+
agents.handoffs.Handoff"agents.handoffs.Handoff"builtins.listr�
9+
input_guardrails#agents.agent.Agent.input_guardrails�
10+
.builtins.list[agents.guardrail.InputGuardrail]B
11+
agents.guardrail.InputGuardrail"agents.guardrail.InputGuardrail"builtins.listr�
12+
output_guardrails$agents.agent.Agent.output_guardrails�
13+
/builtins.list[agents.guardrail.OutputGuardrail]D
14+
agents.guardrail.OutputGuardrail" agents.guardrail.OutputGuardrail"builtins.list*�
15+
__annotations__agents.agent.__annotations__W
16+
builtins.dict[builtins.str,Any]
17+
builtins.str" builtins.str
18+
Any"builtins.dict

python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/agents.guardrail.protobuf

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
agents.guardrail_
3+
OutputGuardrail agents.guardrail.OutputGuardrail"*SonarPythonAnalyzerFakeStub.CustomStubBase]
4+
InputGuardrailagents.guardrail.InputGuardrail"*SonarPythonAnalyzerFakeStub.CustomStubBase*�
5+
__annotations__ agents.guardrail.__annotations__W
6+
builtins.dict[builtins.str,Any]
7+
builtins.str" builtins.str
8+
Any"builtins.dict

python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/agents.handoffs.protobuf

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
agents.handoffsN
3+
Handoffagents.handoffs.Handoff"*SonarPythonAnalyzerFakeStub.CustomStubBase*�
4+
__annotations__agents.handoffs.__annotations__W
5+
builtins.dict[builtins.str,Any]
6+
builtins.str" builtins.str
7+
Any"builtins.dict

python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/agents.protobuf

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
2+
agentsS
3+
TContextagents.run_context.TContext"*SonarPythonAnalyzerFakeStub.CustomStubBase]
4+
InputGuardrailagents.guardrail.InputGuardrail"*SonarPythonAnalyzerFakeStub.CustomStubBase_
5+
OutputGuardrail agents.guardrail.OutputGuardrail"*SonarPythonAnalyzerFakeStub.CustomStubBaseN
6+
Handoffagents.handoffs.Handoff"*SonarPythonAnalyzerFakeStub.CustomStubBase�
7+
Agentagents.agent.Agent"*SonarPythonAnalyzerFakeStub.CustomStubBaser�
8+
handoffsagents.agent.Agent.handoffs�
9+
@builtins.list[Union[agents.agent.Agent,agents.handoffs.Handoff]]�
10+
1Union[agents.agent.Agent,agents.handoffs.Handoff](
11+
agents.agent.Agent"agents.agent.Agent2
12+
agents.handoffs.Handoff"agents.handoffs.Handoff"builtins.listr�
13+
input_guardrails#agents.agent.Agent.input_guardrails�
14+
.builtins.list[agents.guardrail.InputGuardrail]B
15+
agents.guardrail.InputGuardrail"agents.guardrail.InputGuardrail"builtins.listr�
16+
output_guardrails$agents.agent.Agent.output_guardrails�
17+
/builtins.list[agents.guardrail.OutputGuardrail]D
18+
agents.guardrail.OutputGuardrail" agents.guardrail.OutputGuardrail"builtins.list*g
19+
__path__agents.__path__J
20+
builtins.list[builtins.str]
21+
builtins.str" builtins.str"builtins.list*�
22+
__annotations__agents.__annotations__W
23+
builtins.dict[builtins.str,Any]
24+
builtins.str" builtins.str
25+
Any"builtins.dict

python-frontend/src/main/resources/org/sonar/python/types/custom_protobuf/agents.run_context.protobuf

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
agents.run_contextS
3+
TContextagents.run_context.TContext"*SonarPythonAnalyzerFakeStub.CustomStubBase*�
4+
__annotations__"agents.run_context.__annotations__W
5+
builtins.dict[builtins.str,Any]
6+
builtins.str" builtins.str
7+
Any"builtins.dict

python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf/Xlib.ext.composite.protobuf

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,17 @@
77
UnredirectSubindows&Xlib.ext.composite.UnredirectSubindows"Xlib.protocol.rq.Requestj38j39j310j311j312j313j314�
88
CreateRegionFromBorderClip-Xlib.ext.composite.CreateRegionFromBorderClip"Xlib.protocol.rq.Requestj38j39j310j311j312j313j314r
99
NameWindowPixmap#Xlib.ext.composite.NameWindowPixmap"Xlib.protocol.rq.Requestj38j39j310j311j312j313j314w
10-
GetOverlayWindow#Xlib.ext.composite.GetOverlayWindow"Xlib.protocol.rq.ReplyRequestj38j39j310j311j312j313j314�
10+
GetOverlayWindow#Xlib.ext.composite.GetOverlayWindow"Xlib.protocol.rq.ReplyRequestj38j39j310j311j312j313j314�
1111
query_version Xlib.ext.composite.query_version"B
12-
Xlib.ext.composite.QueryVersion"Xlib.ext.composite.QueryVersion*�
13-
self�
14-
:Union[Xlib.display.Display,Xlib.xobject.resource.Resource],
15-
Xlib.display.Display"Xlib.display.Display@
16-
Xlib.xobject.resource.Resource"Xlib.xobject.resource.Resourcez38z39z310z311z312z313z314�
12+
Xlib.ext.composite.QueryVersion"Xlib.ext.composite.QueryVersion*d
13+
selfZ
14+
Union[Xlib.display.Display,Any],
15+
Xlib.display.Display"Xlib.display.Display
16+
Anyz38z39z310z311z312z313z314�
1717
redirect_window"Xlib.ext.composite.redirect_window"
18-
None*F
19-
self<
20-
Xlib.xobject.drawable.Window"Xlib.xobject.drawable.Window*�
18+
None*
19+
self
20+
Any*�
2121
update�
2222
*TypeAlias[CallableType[builtins.function]]K
2323
CallableType[builtins.function]&
@@ -27,11 +27,11 @@
2727
*TypeAlias[CallableType[builtins.function]]K
2828
CallableType[builtins.function]&
2929
builtins.function"builtins.function"Xlib._typing.ErrorHandler
30-
None z38z39z310z311z312z313z314�
30+
None z38z39z310z311z312z313z314�
3131
redirect_subwindows&Xlib.ext.composite.redirect_subwindows"
32-
None*F
33-
self<
34-
Xlib.xobject.drawable.Window"Xlib.xobject.drawable.Window*�
32+
None*
33+
self
34+
Any*�
3535
update�
3636
*TypeAlias[CallableType[builtins.function]]K
3737
CallableType[builtins.function]&
@@ -41,11 +41,11 @@
4141
*TypeAlias[CallableType[builtins.function]]K
4242
CallableType[builtins.function]&
4343
builtins.function"builtins.function"Xlib._typing.ErrorHandler
44-
None z38z39z310z311z312z313z314�
44+
None z38z39z310z311z312z313z314�
4545
unredirect_window$Xlib.ext.composite.unredirect_window"
46-
None*F
47-
self<
48-
Xlib.xobject.drawable.Window"Xlib.xobject.drawable.Window*�
46+
None*
47+
self
48+
Any*�
4949
update�
5050
*TypeAlias[CallableType[builtins.function]]K
5151
CallableType[builtins.function]&
@@ -55,11 +55,11 @@
5555
*TypeAlias[CallableType[builtins.function]]K
5656
CallableType[builtins.function]&
5757
builtins.function"builtins.function"Xlib._typing.ErrorHandler
58-
None z38z39z310z311z312z313z314�
58+
None z38z39z310z311z312z313z314�
5959
unredirect_subwindows(Xlib.ext.composite.unredirect_subwindows"
60-
None*F
61-
self<
62-
Xlib.xobject.drawable.Window"Xlib.xobject.drawable.Window*�
60+
None*
61+
self
62+
Any*�
6363
update�
6464
*TypeAlias[CallableType[builtins.function]]K
6565
CallableType[builtins.function]&
@@ -69,23 +69,23 @@
6969
*TypeAlias[CallableType[builtins.function]]K
7070
CallableType[builtins.function]&
7171
builtins.function"builtins.function"Xlib._typing.ErrorHandler
72-
None z38z39z310z311z312z313z314�
72+
None z38z39z310z311z312z313z314�
7373
create_region_from_border_clip1Xlib.ext.composite.create_region_from_border_clip"
74-
builtins.int" builtins.int*F
75-
self<
76-
Xlib.xobject.drawable.Window"Xlib.xobject.drawable.Window*�
74+
builtins.int" builtins.int*
75+
self
76+
Any*�
7777
onerror�
7878
6Union[TypeAlias[CallableType[builtins.function]],None]�
7979
*TypeAlias[CallableType[builtins.function]]K
8080
CallableType[builtins.function]&
8181
builtins.function"builtins.function"Xlib._typing.ErrorHandler
82-
None z38z39z310z311z312z313z314�
83-
name_window_pixmap%Xlib.ext.composite.name_window_pixmap"<
84-
Xlib.xobject.drawable.Pixmap"Xlib.xobject.drawable.Pixmap*�
85-
self�
86-
:Union[Xlib.display.Display,Xlib.xobject.resource.Resource],
87-
Xlib.display.Display"Xlib.display.Display@
88-
Xlib.xobject.resource.Resource"Xlib.xobject.resource.Resource*�
82+
None z38z39z310z311z312z313z314�
83+
name_window_pixmap%Xlib.ext.composite.name_window_pixmap"
84+
Any*d
85+
selfZ
86+
Union[Xlib.display.Display,Any],
87+
Xlib.display.Display"Xlib.display.Display
88+
Any*�
8989
onerror�
9090
6Union[TypeAlias[CallableType[builtins.function]],None]�
9191
*TypeAlias[CallableType[builtins.function]]K

python-frontend/src/main/resources/org/sonar/python/types/third_party_protobuf/Xlib.ext.damage.protobuf

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,48 +6,48 @@
66
DamageDestroyXlib.ext.damage.DamageDestroy"Xlib.protocol.rq.Requestj38j39j310j311j312j313j314k
77
DamageSubtractXlib.ext.damage.DamageSubtract"Xlib.protocol.rq.Requestj38j39j310j311j312j313j314a
88
DamageAddXlib.ext.damage.DamageAdd"Xlib.protocol.rq.Requestj38j39j310j311j312j313j314e
9-
DamageNotifyXlib.ext.damage.DamageNotify"Xlib.protocol.rq.Eventj38j39j310j311j312j313j314�
9+
DamageNotifyXlib.ext.damage.DamageNotify"Xlib.protocol.rq.Eventj38j39j310j311j312j313j314�
1010
query_versionXlib.ext.damage.query_version"<
11-
Xlib.ext.damage.QueryVersion"Xlib.ext.damage.QueryVersion*�
12-
self�
13-
:Union[Xlib.display.Display,Xlib.xobject.resource.Resource],
14-
Xlib.display.Display"Xlib.display.Display@
15-
Xlib.xobject.resource.Resource"Xlib.xobject.resource.Resourcez38z39z310z311z312z313z314�
11+
Xlib.ext.damage.QueryVersion"Xlib.ext.damage.QueryVersion*d
12+
selfZ
13+
Union[Xlib.display.Display,Any],
14+
Xlib.display.Display"Xlib.display.Display
15+
Anyz38z39z310z311z312z313z314�
1616
damage_createXlib.ext.damage.damage_create"
17-
builtins.int" builtins.int*�
18-
self�
19-
:Union[Xlib.display.Display,Xlib.xobject.resource.Resource],
20-
Xlib.display.Display"Xlib.display.Display@
21-
Xlib.xobject.resource.Resource"Xlib.xobject.resource.Resource*'
17+
builtins.int" builtins.int*d
18+
selfZ
19+
Union[Xlib.display.Display,Any],
20+
Xlib.display.Display"Xlib.display.Display
21+
Any*'
2222
level
23-
builtins.int" builtins.intz38z39z310z311z312z313z314�
23+
builtins.int" builtins.intz38z39z310z311z312z313z314�
2424
damage_destroyXlib.ext.damage.damage_destroy"
25-
None*�
26-
self�
27-
:Union[Xlib.display.Display,Xlib.xobject.resource.Resource],
28-
Xlib.display.Display"Xlib.display.Display@
29-
Xlib.xobject.resource.Resource"Xlib.xobject.resource.Resource*(
25+
None*d
26+
selfZ
27+
Union[Xlib.display.Display,Any],
28+
Xlib.display.Display"Xlib.display.Display
29+
Any*(
3030
damage
31-
builtins.int" builtins.intz38z39z310z311z312z313z314�
31+
builtins.int" builtins.intz38z39z310z311z312z313z314�
3232
damage_subtractXlib.ext.damage.damage_subtract"
33-
None*�
34-
self�
35-
:Union[Xlib.display.Display,Xlib.xobject.resource.Resource],
36-
Xlib.display.Display"Xlib.display.Display@
37-
Xlib.xobject.resource.Resource"Xlib.xobject.resource.Resource*(
33+
None*d
34+
selfZ
35+
Union[Xlib.display.Display,Any],
36+
Xlib.display.Display"Xlib.display.Display
37+
Any*(
3838
damage
3939
builtins.int" builtins.int**
4040
repair
4141
builtins.int" builtins.int *)
4242
parts
43-
builtins.int" builtins.int z38z39z310z311z312z313z314�
43+
builtins.int" builtins.int z38z39z310z311z312z313z314�
4444

4545
damage_addXlib.ext.damage.damage_add"
46-
None*�
47-
self�
48-
:Union[Xlib.display.Display,Xlib.xobject.resource.Resource],
49-
Xlib.display.Display"Xlib.display.Display@
50-
Xlib.xobject.resource.Resource"Xlib.xobject.resource.Resource*(
46+
None*d
47+
selfZ
48+
Union[Xlib.display.Display,Any],
49+
Xlib.display.Display"Xlib.display.Display
50+
Any*(
5151
repair
5252
builtins.int" builtins.int*'
5353
parts

0 commit comments

Comments
 (0)