Skip to content

Commit 06320bf

Browse files
committed
V4 service test implementation
1 parent 7fba358 commit 06320bf

File tree

23 files changed

+1626
-1477
lines changed

23 files changed

+1626
-1477
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ build_olingo:
7070
$(DOCKER_BIN) build -t $(DOCKER_NAME) $(TESTS_OLINGO_SERVER)
7171

7272
run_olingo:
73-
$(DOCKER_BIN) run -it -p 8888:8080 --name $(DOCKER_NAME) $(DOCKER_NAME):latest
73+
$(DOCKER_BIN) run -d -it -p 8888:8080 --name $(DOCKER_NAME) $(DOCKER_NAME):latest
7474

7575
stop_olingo:
7676
$(DOCKER_BIN) stop $(DOCKER_NAME)

pyodata/client.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
from pyodata.exceptions import PyODataException, HttpError
99
from pyodata.v2.service import Service
1010
from pyodata.v2 import ODataV2
11+
from pyodata.v4 import ODataV4
12+
13+
import pyodata.v4 as v4
1114

1215

1316
def _fetch_metadata(connection, url, logger):
@@ -62,11 +65,14 @@ def __new__(cls, url, connection, namespaces=None,
6265
config.namespaces = namespaces
6366

6467
# create model instance from received metadata
65-
logger.info('Creating OData Schema (version: %d)', config.odata_version)
68+
logger.info('Creating OData Schema (version: %s)', str(config.odata_version))
6669
schema = MetadataBuilder(metadata, config=config).build()
6770

6871
# create service instance based on model we have
69-
logger.info('Creating OData Service (version: %d)', config.odata_version)
72+
logger.info('Creating OData Service (version: %s)', str(config.odata_version))
73+
7074
service = Service(url, schema, connection)
75+
if config.odata_version == ODataV4:
76+
return v4.Service(url, schema, connection)
7177

7278
return service

pyodata/model/elements.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,13 +273,19 @@ def to_literal(self, value):
273273

274274
return [self._item_type.traits.to_literal(v) for v in value]
275275

276+
def to_json(self, value):
277+
return self.to_literal(value)
278+
276279
# pylint: disable=no-self-use
277280
def from_json(self, value):
278281
if not isinstance(value, list):
279282
raise PyODataException('Bad format: invalid list value {}'.format(value))
280283

281284
return [self._item_type.traits.from_json(v) for v in value]
282285

286+
def from_literal(self, value):
287+
return self.from_json(value)
288+
283289

284290
class VariableDeclaration(Identifier):
285291
MAXIMUM_LENGTH = -1

pyodata/v2/service.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ def _build_values(entity_type: EntityType, entity: Any) -> Any:
469469
val = entity_type.proprty(key).typ.traits.to_json(val) # type: ignore
470470
except PyODataModelError:
471471
try:
472-
nav_prop = entity_type.nav_proprty(key) # type: ignore
472+
nav_prop = entity_type.nav_proprty(key) # type: ignore
473473
val = EntityCreateRequest._build_values(nav_prop.typ, val)
474474
except PyODataModelError:
475475
raise PyODataException('Property {} is not declared in {} entity type'.format(
@@ -691,7 +691,7 @@ def parameter(self, name: str, value: int) -> 'FunctionRequest':
691691

692692
# check if param is valid (is declared in metadata)
693693
try:
694-
param = self._function_import.get_parameter(name) # type: ignore
694+
param = self._function_import.get_parameter(name) # type: ignore
695695

696696
# add parameter as custom query argument
697697
self.custom(param.name, param.typ.traits.to_literal(value))
@@ -734,7 +734,7 @@ def __init__(self, service: 'Service', entity_set: Union[EntitySet, 'EntitySetPr
734734
if proprties is not None:
735735

736736
# first, cache values of direct properties
737-
for type_proprty in self._entity_type.proprties(): # type: ignore
737+
for type_proprty in self._entity_type.proprties(): # type: ignore
738738
if type_proprty.name in proprties:
739739
if proprties[type_proprty.name] is not None:
740740
self._cache[type_proprty.name] = type_proprty.typ.traits.from_json(proprties[type_proprty.name])
@@ -812,7 +812,7 @@ def nav(self, nav_property: str) -> Union['NavEntityProxy', 'EntitySetProxy']:
812812

813813
# for now duplicated with simillar method in entity set proxy class
814814
try:
815-
navigation_property = self._entity_type.nav_proprty(nav_property) # type: ignore
815+
navigation_property = self._entity_type.nav_proprty(nav_property) # type: ignore
816816
except KeyError:
817817
raise PyODataException('Navigation property {} is not declared in {} entity type'.format(
818818
nav_property, self._entity_type))
@@ -1283,7 +1283,7 @@ def function_import_handler(fimport: FunctionImport,
12831283

12841284
# 1. if return types is "entity type", return instance of appropriate entity proxy
12851285
if isinstance(fimport.return_type, elements.EntityType):
1286-
entity_set = self._service.schema.entity_set(fimport.entity_set_name) # type: ignore
1286+
entity_set = self._service.schema.entity_set(fimport.entity_set_name) # type: ignore
12871287
return EntityProxy(self._service, entity_set, fimport.return_type, response_data)
12881288

12891289
# 2. return raw data for all other return types (primitives, complex types encoded in dicts, etc.)

pyodata/v4/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
build_navigation_type_property, build_navigation_property_binding, build_entity_set_with_v4_builder, build_enum_type
1414
from .type_traits import EdmDateTypTraits, GeoTypeTraits, EdmDoubleQuotesEncapsulatedTypTraits, \
1515
EdmTimeOfDay, EdmDateTimeOffsetTypTraits, EdmDuration
16+
from .service import Service # noqa
1617

1718

1819
class ODataV4(ODATAVersion):

pyodata/v4/build_functions.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,10 @@ def build_schema(config: Config, schema_nodes):
9292
for ref_con in nav_prop.referential_constraints:
9393
try:
9494
proprty = stype.proprty(ref_con.proprty_name)
95-
referenced_proprty = nav_prop.typ.proprty(ref_con.referenced_proprty_name)
95+
if nav_prop.typ.is_collection:
96+
referenced_proprty = nav_prop.typ.item_type.proprty(ref_con.referenced_proprty_name)
97+
else:
98+
referenced_proprty = nav_prop.typ.proprty(ref_con.referenced_proprty_name)
9699
except PyODataModelError as ex:
97100
config.err_policy(ParserError.REFERENTIAL_CONSTRAINT).resolve(ex)
98101
proprty = NullProperty(ref_con.proprty_name)

0 commit comments

Comments
 (0)