Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(operator_capabilities): operator emulation wasn't expose to front end #301

Merged
merged 6 commits into from
Dec 20, 2024
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/_example/django/django_demo/.forestadmin-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -3542,10 +3542,10 @@
],
"meta": {
"liana": "agent-python",
"liana_version": "1.18.5",
"liana_version": "1.17.0",
"stack": {
"engine": "python",
"engine_version": "3.11.11"
"engine_version": "3.12.4"
}
}
}
2 changes: 2 additions & 0 deletions src/agent_toolkit/forestadmin/agent_toolkit/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ async def __mk_resources(self):
self._resources: Resources = {
"capabilities": CapabilitiesResource(
self.customizer.composite_datasource,
await self.customizer.get_datasource(),
self._permission_service,
self._ip_white_list_service,
self.options,
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@

from forestadmin.agent_toolkit.forest_logger import ForestLogger
from forestadmin.agent_toolkit.options import Options
from forestadmin.agent_toolkit.resources.collections.base_collection_resource import BaseCollectionResource
from forestadmin.agent_toolkit.resources.collections.decorators import authenticate, check_method, ip_white_list
from forestadmin.agent_toolkit.resources.ip_white_list_resource import IpWhitelistResource
from forestadmin.agent_toolkit.services.permissions.ip_whitelist_service import IpWhiteListService
from forestadmin.agent_toolkit.services.permissions.permission_service import PermissionService
from forestadmin.agent_toolkit.utils.context import HttpResponseBuilder, Request, RequestMethod, Response
from forestadmin.agent_toolkit.utils.forest_schema.generator_field import SchemaFieldGenerator
from forestadmin.datasource_toolkit.datasource_customizer.datasource_composite import CompositeDatasource
Expand All @@ -17,14 +18,16 @@
DatasourceAlias = Union[Datasource[BoundCollection], DatasourceCustomizer]


class CapabilitiesResource(IpWhitelistResource):
class CapabilitiesResource(BaseCollectionResource):
def __init__(
self,
composite_datasource: CompositeDatasource,
datasource: Union[Datasource, DatasourceCustomizer],
permission: PermissionService,
ip_white_list_service: IpWhiteListService,
options: Options,
):
super().__init__(ip_white_list_service, options)
super().__init__(datasource, permission, ip_white_list_service, options)
self.composite_datasource: CompositeDatasource = composite_datasource

@ip_white_list
Expand Down Expand Up @@ -52,7 +55,7 @@ async def capabilities(self, request: Request) -> Response:
return HttpResponseBuilder.build_success_response(ret)

def _get_collection_capability(self, collection_name: str) -> Dict[str, Any]:
collection = self.composite_datasource.get_collection(collection_name)
collection = self.datasource.get_collection(collection_name)
fields = []
for field_name, field_schema in collection.schema["fields"].items():
if is_column(field_schema):
Expand Down
51 changes: 48 additions & 3 deletions src/agent_toolkit/tests/resources/test_capabilities_resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
from forestadmin.agent_toolkit.services.permissions.permission_service import PermissionService
from forestadmin.agent_toolkit.utils.context import Request, RequestMethod, Response, User
from forestadmin.datasource_toolkit.collections import Collection
from forestadmin.datasource_toolkit.datasource_customizer.datasource_customizer import DatasourceCustomizer
from forestadmin.datasource_toolkit.datasources import Datasource
from forestadmin.datasource_toolkit.interfaces.fields import FieldType, Operator, PrimitiveType

Expand Down Expand Up @@ -94,6 +95,12 @@ def setUpClass(cls) -> None:
"type": FieldType.COLUMN,
"filter_operators": set([]),
},
"created_at": {
"column_type": PrimitiveType.DATE,
"is_primary_key": False,
"type": FieldType.COLUMN,
"filter_operators": set([Operator.EQUAL, Operator.GREATER_THAN, Operator.LESS_THAN]),
},
} # type:ignore
)
cls.datasource.add_collection(cls.book_collection)
Expand All @@ -108,9 +115,17 @@ def setUpClass(cls) -> None:
timezone=zoneinfo.ZoneInfo("Europe/Paris"),
request={"ip": "127.0.0.1"},
)
cls.datasource_customizer = DatasourceCustomizer()
cls.datasource_customizer.add_datasource(cls.datasource)

def setUp(self) -> None:
self.capabilities_resource = CapabilitiesResource(self.datasource, self.ip_white_list_service, self.options)
self.capabilities_resource = CapabilitiesResource(
self.datasource_customizer.composite_datasource,
self.loop.run_until_complete(self.datasource_customizer.get_datasource()),
self.permission_service,
self.ip_white_list_service,
self.options,
)

def test_dispatch_should_not_dispatch_to_capabilities_when_no_post_request(self):
for method in [RequestMethod.DELETE, RequestMethod.OPTIONS, RequestMethod.PUT]:
Expand All @@ -127,7 +142,7 @@ def test_dispatch_should_not_dispatch_to_capabilities_when_no_post_request(self)

self.assertEqual(response.status, 405)

def test_dispatch_should_return_correct_collection_and_fields_capabilities(self):
def test_dispatch_should_return_correct_collection_and_fields_capabilities_with_emulated_operators(self):
request = Request(
method=RequestMethod.POST,
query={},
Expand All @@ -148,10 +163,40 @@ def test_dispatch_should_return_correct_collection_and_fields_capabilities(self)
{
"name": "id",
"type": "Number",
"operators": ["equal", "greater_than", "in", "less_than"],
"operators": ["blank", "equal", "greater_than", "in", "less_than", "missing"],
},
{"name": "name", "type": "String", "operators": []},
{"name": "cost", "type": "Number", "operators": []},
{
"name": "created_at",
"type": "Date",
"operators": [
"after",
"after_x_hours_ago",
"before",
"before_x_hours_ago",
"blank",
"equal",
"future",
"greater_than",
"in",
"less_than",
"missing",
"past",
"previous_month",
"previous_month_to_date",
"previous_quarter",
"previous_quarter_to_date",
"previous_week",
"previous_week_to_date",
"previous_x_days",
"previous_x_days_to_date",
"previous_year",
"previous_year_to_date",
"today",
"yesterday",
],
},
],
}
],
Expand Down
6 changes: 5 additions & 1 deletion src/agent_toolkit/tests/test_agent_toolkit.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,11 @@ def test_property_resources(

mocked_authentication_resource.assert_called_once_with(agent._ip_white_list_service, agent.options)
mocked_capabilities_resource.assert_called_once_with(
agent.customizer.composite_datasource, agent._ip_white_list_service, agent.options
agent.customizer.composite_datasource,
"fake_datasource",
agent._permission_service,
agent._ip_white_list_service,
agent.options,
)
mocked_crud_resource.assert_called_once_with(
agent.customizer.composite_datasource,
Expand Down
Loading