Skip to content

Commit 7028477

Browse files
SONARPY-873 Run Typeshed serializer on Cirrus (#943)
1 parent e553553 commit 7028477

File tree

6 files changed

+81
-53
lines changed

6 files changed

+81
-53
lines changed

.cirrus.yml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,12 @@ win_vm_definition: &WINDOWS_VM_DEFINITION
3535

3636
build_task:
3737
gke_container:
38-
<<: *CONTAINER_DEFINITION
38+
dockerfile: .cirrus/python-env.Dockerfile
39+
builder_image_project: language-team
40+
builder_image_name: docker-builder-lt-v1
41+
cluster_name: cirrus-ci-lt-cluster
42+
zone: us-central1-a
43+
namespace: default
3944
cpu: 2
4045
memory: 2G
4146
env:
@@ -65,7 +70,7 @@ build_win_task:
6570
folder: ~/.m2/repository
6671
build_script:
6772
- git submodule update --init
68-
- mvn.cmd -s /c/buildTools-docker/settings-public.xml test
73+
- mvn.cmd -s /c/buildTools-docker/settings-public.xml test -DskipTypeshed=true
6974
cleanup_before_cache_script: cleanup_maven_repository
7075

7176
plugin_qa_task:

.cirrus/python-env.Dockerfile

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
FROM gcr.io/language-team/base:latest
2+
USER root
3+
ENV PYTHON_VERSION=3.9.5
4+
RUN apt-get update && apt-get install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev curl libbz2-dev
5+
RUN curl -O https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tar.xz
6+
RUN tar -xf Python-${PYTHON_VERSION}.tar.xz
7+
RUN cd Python-${PYTHON_VERSION} && ./configure --enable-optimizations && make -j 4 && make altinstall
8+
RUN cd /usr/local/bin \
9+
&& ln -s python3.9 python \
10+
&& ln -s python3.9 python3 \
11+
&& ln -s pip3.9 pip \
12+
&& ln -s pip3.9 pip3
13+
RUN python3.9 -m pip install --upgrade pip
14+
USER sonarsource
15+
RUN pip install tox
16+
ENV PATH=${PATH}:/home/sonarsource/.local/bin

python-frontend/pom.xml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111
<artifactId>python-frontend</artifactId>
1212

1313
<name>Python :: Frontend</name>
14-
14+
<properties>
15+
<sonar.sources>pom.xml,src/main/java,typeshed_serializer/serializer</sonar.sources>
16+
<sonar.python.coverage.reportPaths>typeshed_serializer/cov.xml</sonar.python.coverage.reportPaths>
17+
</properties>
1518
<dependencies>
1619
<dependency>
1720
<groupId>org.sonarsource.sslr</groupId>
@@ -122,7 +125,7 @@
122125
<activation>
123126
<property>
124127
<name>
125-
generateTypeshed
128+
!skipTypeshed
126129
</name>
127130
</property>
128131
</activation>

python-frontend/typeshed_serializer/requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@ protobuf==3.17.3
44
six==1.16.0
55
toml==0.10.2
66
typing-extensions==3.10.0.0
7+
pytest==6.2.4
8+
pytest-cov==2.12.1
Lines changed: 48 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,53 @@
1-
import unittest
2-
1+
import pytest
32
import mypy.nodes as mpn
43

54
from serializer import typeshed_serializer, symbols
65

76

8-
class TypeshedSerializerTest(unittest.TestCase):
9-
@classmethod
10-
def setUpClass(cls) -> None:
11-
cls.build_result = typeshed_serializer.walk_typeshed_stdlib()
12-
13-
def test_build_mypy_model(self):
14-
self.assertIsNotNone(self.build_result)
15-
16-
def test_module_symbol(self):
17-
abc_module = self.build_result.files.get("abc")
18-
module_symbol = symbols.ModuleSymbol(abc_module)
19-
self.assertEqual(module_symbol.fullname, "abc")
20-
self.assertEqual(len(module_symbol.classes), 3)
21-
self.assertEqual(len(module_symbol.functions), 4)
22-
23-
def test_class_symbol(self):
24-
mypy_cmd_module = self.build_result.files.get("cmd")
25-
mypy_cmd_class = mypy_cmd_module.names.get("Cmd")
26-
cmd_class_symbol = symbols.ClassSymbol(mypy_cmd_class.node)
27-
self.assertEqual(cmd_class_symbol.fullname, "cmd.Cmd")
28-
self.assertEqual(cmd_class_symbol.name, "Cmd")
29-
self.assertEqual(cmd_class_symbol.super_classes, ["builtins.object"])
30-
self.assertEqual(len(cmd_class_symbol.mro), 0)
31-
32-
def test_function_symbol(self):
33-
mypy_cmd_module = self.build_result.files.get("cmd")
34-
mypy_cmd_class_node = mypy_cmd_module.names.get("Cmd").node
35-
self.assertIsInstance(mypy_cmd_class_node, mpn.TypeInfo)
36-
mypy_completenames_method_node = mypy_cmd_class_node.names.get("completenames").node
37-
self.assertIsInstance(mypy_completenames_method_node, mpn.FuncDef)
38-
completenames_method_symbol = symbols.FunctionSymbol(mypy_completenames_method_node)
39-
self.assertEqual(completenames_method_symbol.name, "completenames")
40-
self.assertEqual(completenames_method_symbol.fullname, "cmd.Cmd.completenames")
41-
self.assertFalse(completenames_method_symbol.has_decorators)
42-
self.assertFalse(completenames_method_symbol.is_asynchronous)
43-
self.assertEqual(completenames_method_symbol.return_type.pretty_printed_name, "builtins.list[builtins.str]")
44-
self.assertEqual(len(completenames_method_symbol.resolved_decorator_names), 0)
45-
self.assertEqual(completenames_method_symbol.fullname, "cmd.Cmd.completenames")
46-
47-
args = completenames_method_symbol.parameters
48-
self.assertEqual(len(args), 3)
49-
50-
51-
if __name__ == '__main__':
52-
unittest.main()
7+
@pytest.fixture(scope="module")
8+
def typeshed_stdlib():
9+
return typeshed_serializer.walk_typeshed_stdlib()
10+
11+
12+
def test_build_mypy_model(typeshed_stdlib):
13+
assert typeshed_stdlib is not None
14+
15+
16+
def test_module_symbol(typeshed_stdlib):
17+
abc_module = typeshed_stdlib.files.get("abc")
18+
module_symbol = symbols.ModuleSymbol(abc_module)
19+
assert module_symbol.fullname == "abc"
20+
assert len(module_symbol.classes) == 3
21+
assert len(module_symbol.functions) == 4
22+
23+
24+
def test_class_symbol(typeshed_stdlib):
25+
mypy_cmd_module = typeshed_stdlib.files.get("cmd")
26+
mypy_cmd_class = mypy_cmd_module.names.get("Cmd")
27+
cmd_class_symbol = symbols.ClassSymbol(mypy_cmd_class.node)
28+
assert cmd_class_symbol.fullname == "cmd.Cmd"
29+
assert cmd_class_symbol.name == "Cmd"
30+
assert cmd_class_symbol.super_classes == ["builtins.object"]
31+
assert len(cmd_class_symbol.mro) == 0
32+
33+
34+
def test_function_symbol(typeshed_stdlib):
35+
mypy_cmd_module = typeshed_stdlib.files.get("cmd")
36+
37+
mypy_cmd_class_node = mypy_cmd_module.names.get("Cmd").node
38+
assert isinstance(mypy_cmd_class_node, mpn.TypeInfo)
39+
40+
mypy_completenames_method_node = mypy_cmd_class_node.names.get("completenames").node
41+
assert isinstance(mypy_completenames_method_node, mpn.FuncDef)
42+
43+
completenames_method_symbol = symbols.FunctionSymbol(mypy_completenames_method_node)
44+
assert completenames_method_symbol.name == "completenames"
45+
assert completenames_method_symbol.fullname == "cmd.Cmd.completenames"
46+
assert not completenames_method_symbol.has_decorators
47+
assert not completenames_method_symbol.is_asynchronous
48+
assert completenames_method_symbol.return_type.pretty_printed_name == "builtins.list[builtins.str]"
49+
assert len(completenames_method_symbol.resolved_decorator_names) == 0
50+
assert completenames_method_symbol.fullname == "cmd.Cmd.completenames"
51+
52+
args = completenames_method_symbol.parameters
53+
assert len(args) == 3

python-frontend/typeshed_serializer/tox.ini

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
[tox]
2-
envlist = py38, serialize
2+
envlist = py39, serialize
33
skipsdist = True
44

55
[testenv]
66
deps = -rrequirements.txt
7-
commands = python -m unittest
7+
whitelist_externals = pytest
8+
commands = pytest --cov=serializer --cov-report xml:cov.xml --ignore=resources
89

910
[testenv:serialize]
1011
deps = -rrequirements.txt

0 commit comments

Comments
 (0)