chalkpy 2.96.0__py3-none-any.whl → 2.96.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,39 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: chalk/engine/v2/introspection_service.proto
4
+ # Protobuf Python Version: 4.25.3
5
+ """Generated protocol buffer code."""
6
+
7
+ from google.protobuf import descriptor as _descriptor
8
+ from google.protobuf import descriptor_pool as _descriptor_pool
9
+ from google.protobuf import symbol_database as _symbol_database
10
+ from google.protobuf.internal import builder as _builder
11
+ # @@protoc_insertion_point(imports)
12
+
13
+ _sym_db = _symbol_database.Default()
14
+
15
+
16
+ from chalk._gen.chalk.auth.v1 import permissions_pb2 as chalk_dot_auth_dot_v1_dot_permissions__pb2
17
+
18
+
19
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(
20
+ b'\n+chalk/engine/v2/introspection_service.proto\x12\x0f\x63halk.engine.v2\x1a\x1f\x63halk/auth/v1/permissions.proto"8\n\x17ParseSQLResolverRequest\x12\x1d\n\nsql_string\x18\x01 \x01(\tR\tsqlString"L\n\x18ParseSQLResolverResponse\x12\x16\n\x06inputs\x18\x01 \x03(\tR\x06inputs\x12\x18\n\x07outputs\x18\x02 \x03(\tR\x07outputs2\x87\x01\n\x14IntrospectionService\x12o\n\x10ParseSQLResolver\x12(.chalk.engine.v2.ParseSQLResolverRequest\x1a).chalk.engine.v2.ParseSQLResolverResponse"\x06\x90\x02\x01\x80}\x02\x42\x8e\x01\n\x13\x63om.chalk.engine.v2B\x19IntrospectionServiceProtoP\x01\xa2\x02\x03\x43\x45X\xaa\x02\x0f\x43halk.Engine.V2\xca\x02\x0f\x43halk\\Engine\\V2\xe2\x02\x1b\x43halk\\Engine\\V2\\GPBMetadata\xea\x02\x11\x43halk::Engine::V2b\x06proto3'
21
+ )
22
+
23
+ _globals = globals()
24
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
25
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "chalk.engine.v2.introspection_service_pb2", _globals)
26
+ if _descriptor._USE_C_DESCRIPTORS == False:
27
+ _globals["DESCRIPTOR"]._options = None
28
+ _globals[
29
+ "DESCRIPTOR"
30
+ ]._serialized_options = b"\n\023com.chalk.engine.v2B\031IntrospectionServiceProtoP\001\242\002\003CEX\252\002\017Chalk.Engine.V2\312\002\017Chalk\\Engine\\V2\342\002\033Chalk\\Engine\\V2\\GPBMetadata\352\002\021Chalk::Engine::V2"
31
+ _globals["_INTROSPECTIONSERVICE"].methods_by_name["ParseSQLResolver"]._options = None
32
+ _globals["_INTROSPECTIONSERVICE"].methods_by_name["ParseSQLResolver"]._serialized_options = b"\220\002\001\200}\002"
33
+ _globals["_PARSESQLRESOLVERREQUEST"]._serialized_start = 97
34
+ _globals["_PARSESQLRESOLVERREQUEST"]._serialized_end = 153
35
+ _globals["_PARSESQLRESOLVERRESPONSE"]._serialized_start = 155
36
+ _globals["_PARSESQLRESOLVERRESPONSE"]._serialized_end = 231
37
+ _globals["_INTROSPECTIONSERVICE"]._serialized_start = 234
38
+ _globals["_INTROSPECTIONSERVICE"]._serialized_end = 369
39
+ # @@protoc_insertion_point(module_scope)
@@ -0,0 +1,21 @@
1
+ from chalk._gen.chalk.auth.v1 import permissions_pb2 as _permissions_pb2
2
+ from google.protobuf.internal import containers as _containers
3
+ from google.protobuf import descriptor as _descriptor
4
+ from google.protobuf import message as _message
5
+ from typing import ClassVar as _ClassVar, Iterable as _Iterable, Optional as _Optional
6
+
7
+ DESCRIPTOR: _descriptor.FileDescriptor
8
+
9
+ class ParseSQLResolverRequest(_message.Message):
10
+ __slots__ = ("sql_string",)
11
+ SQL_STRING_FIELD_NUMBER: _ClassVar[int]
12
+ sql_string: str
13
+ def __init__(self, sql_string: _Optional[str] = ...) -> None: ...
14
+
15
+ class ParseSQLResolverResponse(_message.Message):
16
+ __slots__ = ("inputs", "outputs")
17
+ INPUTS_FIELD_NUMBER: _ClassVar[int]
18
+ OUTPUTS_FIELD_NUMBER: _ClassVar[int]
19
+ inputs: _containers.RepeatedScalarFieldContainer[str]
20
+ outputs: _containers.RepeatedScalarFieldContainer[str]
21
+ def __init__(self, inputs: _Optional[_Iterable[str]] = ..., outputs: _Optional[_Iterable[str]] = ...) -> None: ...
@@ -0,0 +1,80 @@
1
+ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
2
+ """Client and server classes corresponding to protobuf-defined services."""
3
+
4
+ import grpc
5
+
6
+ from chalk._gen.chalk.engine.v2 import (
7
+ introspection_service_pb2 as chalk_dot_engine_dot_v2_dot_introspection__service__pb2,
8
+ )
9
+
10
+
11
+ class IntrospectionServiceStub(object):
12
+ """Missing associated documentation comment in .proto file."""
13
+
14
+ def __init__(self, channel):
15
+ """Constructor.
16
+
17
+ Args:
18
+ channel: A grpc.Channel.
19
+ """
20
+ self.ParseSQLResolver = channel.unary_unary(
21
+ "/chalk.engine.v2.IntrospectionService/ParseSQLResolver",
22
+ request_serializer=chalk_dot_engine_dot_v2_dot_introspection__service__pb2.ParseSQLResolverRequest.SerializeToString,
23
+ response_deserializer=chalk_dot_engine_dot_v2_dot_introspection__service__pb2.ParseSQLResolverResponse.FromString,
24
+ )
25
+
26
+
27
+ class IntrospectionServiceServicer(object):
28
+ """Missing associated documentation comment in .proto file."""
29
+
30
+ def ParseSQLResolver(self, request, context):
31
+ """Missing associated documentation comment in .proto file."""
32
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
33
+ context.set_details("Method not implemented!")
34
+ raise NotImplementedError("Method not implemented!")
35
+
36
+
37
+ def add_IntrospectionServiceServicer_to_server(servicer, server):
38
+ rpc_method_handlers = {
39
+ "ParseSQLResolver": grpc.unary_unary_rpc_method_handler(
40
+ servicer.ParseSQLResolver,
41
+ request_deserializer=chalk_dot_engine_dot_v2_dot_introspection__service__pb2.ParseSQLResolverRequest.FromString,
42
+ response_serializer=chalk_dot_engine_dot_v2_dot_introspection__service__pb2.ParseSQLResolverResponse.SerializeToString,
43
+ ),
44
+ }
45
+ generic_handler = grpc.method_handlers_generic_handler("chalk.engine.v2.IntrospectionService", rpc_method_handlers)
46
+ server.add_generic_rpc_handlers((generic_handler,))
47
+
48
+
49
+ # This class is part of an EXPERIMENTAL API.
50
+ class IntrospectionService(object):
51
+ """Missing associated documentation comment in .proto file."""
52
+
53
+ @staticmethod
54
+ def ParseSQLResolver(
55
+ request,
56
+ target,
57
+ options=(),
58
+ channel_credentials=None,
59
+ call_credentials=None,
60
+ insecure=False,
61
+ compression=None,
62
+ wait_for_ready=None,
63
+ timeout=None,
64
+ metadata=None,
65
+ ):
66
+ return grpc.experimental.unary_unary(
67
+ request,
68
+ target,
69
+ "/chalk.engine.v2.IntrospectionService/ParseSQLResolver",
70
+ chalk_dot_engine_dot_v2_dot_introspection__service__pb2.ParseSQLResolverRequest.SerializeToString,
71
+ chalk_dot_engine_dot_v2_dot_introspection__service__pb2.ParseSQLResolverResponse.FromString,
72
+ options,
73
+ channel_credentials,
74
+ insecure,
75
+ call_credentials,
76
+ compression,
77
+ wait_for_ready,
78
+ timeout,
79
+ metadata,
80
+ )
@@ -0,0 +1,36 @@
1
+ """
2
+ @generated by mypy-protobuf. Do not edit manually!
3
+ isort:skip_file
4
+ """
5
+
6
+ from abc import (
7
+ ABCMeta,
8
+ abstractmethod,
9
+ )
10
+ from chalk._gen.chalk.engine.v2.introspection_service_pb2 import (
11
+ ParseSQLResolverRequest,
12
+ ParseSQLResolverResponse,
13
+ )
14
+ from grpc import (
15
+ Channel,
16
+ Server,
17
+ ServicerContext,
18
+ UnaryUnaryMultiCallable,
19
+ )
20
+
21
+ class IntrospectionServiceStub:
22
+ def __init__(self, channel: Channel) -> None: ...
23
+ ParseSQLResolver: UnaryUnaryMultiCallable[
24
+ ParseSQLResolverRequest,
25
+ ParseSQLResolverResponse,
26
+ ]
27
+
28
+ class IntrospectionServiceServicer(metaclass=ABCMeta):
29
+ @abstractmethod
30
+ def ParseSQLResolver(
31
+ self,
32
+ request: ParseSQLResolverRequest,
33
+ context: ServicerContext,
34
+ ) -> ParseSQLResolverResponse: ...
35
+
36
+ def add_IntrospectionServiceServicer_to_server(servicer: IntrospectionServiceServicer, server: Server) -> None: ...
chalk/_version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "2.96.0"
1
+ __version__ = "2.96.1"
@@ -837,10 +837,98 @@ class EscapedSqlString:
837
837
  errors: List[ResolverError]
838
838
 
839
839
 
840
+ @dataclasses.dataclass
841
+ class ParsedSqlResolver:
842
+ inputs: list[str]
843
+ outputs: list[str]
844
+
845
+
846
+ def parse_sql_resolver(sql_string: str) -> ParsedSqlResolver:
847
+ """
848
+ Parse a SQL resolver string to extract input and output features.
849
+
850
+ Args:
851
+ sql_string: SQL string with ${feature.name} syntax for inputs and directive comments
852
+
853
+ Returns:
854
+ ParsedSqlResolver with inputs (feature names) and outputs (fully qualified column names)
855
+ """
856
+ try:
857
+ import sqlglot
858
+ import sqlglot.expressions
859
+ except ImportError:
860
+ raise missing_dependency_exception("chalkpy[runtime]")
861
+
862
+ from chalk._lsp.error_builder import SQLFileResolverErrorBuilder
863
+
864
+ error_builder = SQLFileResolverErrorBuilder(
865
+ uri="<parse-request>",
866
+ sql_string=sql_string,
867
+ has_import_errors=False,
868
+ )
869
+
870
+ # Extract inputs
871
+ escaped = escape_sql_params(
872
+ sql_string=sql_string,
873
+ path="<parse-request>",
874
+ error_builder=error_builder,
875
+ parse_only=True,
876
+ )
877
+ inputs = list(escaped.args.values())
878
+ sql_string = escaped.escaped_sql_string
879
+
880
+ # Parse directive comments
881
+ comments = ""
882
+ docstring = ""
883
+ for comment in sql_string.splitlines():
884
+ if comment.strip().startswith("--"):
885
+ stripped_comment = comment.strip().replace("--", "")
886
+ if stripped_comment.strip().startswith("-"):
887
+ comments += f"{stripped_comment}\n"
888
+ else:
889
+ if count_colons(stripped_comment) != 1:
890
+ docstring += f"{stripped_comment.strip()}\n"
891
+ else:
892
+ comments += f"{stripped_comment}\n"
893
+ else:
894
+ break
895
+
896
+ # Extract resolves and namespace directives to build the output namespace
897
+ namespace_str = None
898
+ if len(comments) != 0:
899
+ try:
900
+ comment_dict: Dict[str, Any] = yaml.safe_load(comments)
901
+ except Exception:
902
+ comment_dict = {}
903
+
904
+ if comment_dict and "resolves" in comment_dict:
905
+ resolves = comment_dict["resolves"]
906
+ namespace_from_comment = comment_dict.get("namespace")
907
+ namespace_str = build_namespaced_name(namespace=namespace_from_comment, name=to_snake_case(resolves))
908
+
909
+ # Parse SELECT columns and qualify with namespace if available
910
+ outputs = []
911
+ try:
912
+ glots = sqlglot.parse(sql=sql_string)
913
+ if glots:
914
+ glot = glots[0]
915
+ if isinstance(glot, (sqlglot.expressions.Select, sqlglot.expressions.Union)):
916
+ raw_outputs = list(glot.named_selects)
917
+ if namespace_str:
918
+ outputs = [f"{namespace_str}.{col}" for col in raw_outputs]
919
+ else:
920
+ outputs = raw_outputs
921
+ except Exception:
922
+ pass
923
+
924
+ return ParsedSqlResolver(inputs=inputs, outputs=outputs)
925
+
926
+
840
927
  def escape_sql_params(
841
928
  sql_string: str,
842
929
  path: str,
843
930
  error_builder: SQLFileResolverErrorBuilder,
931
+ parse_only: bool = False,
844
932
  ) -> EscapedSqlString:
845
933
  """
846
934
  Chalk allows people to write SQL resolvers that reference features using ${} syntax, such as:
@@ -853,6 +941,7 @@ def escape_sql_params(
853
941
  :param sql_string: String of hte original SQL resolver
854
942
  :param path: For error reporting, filepath of the SQL resolver
855
943
  :param error_builder: For LSP errors
944
+ :param parse_only: If True, skip feature registry lookups for default values
856
945
  """
857
946
  args = {} # sql string -> input feature string
858
947
 
@@ -891,8 +980,9 @@ def escape_sql_params(
891
980
  variable = split[0].strip()
892
981
  default_arg = split[1].strip()
893
982
  default_arg = json.loads(default_arg)
894
- f = Feature.from_root_fqn(variable)
895
- default_arg = f.converter.from_json_to_rich(default_arg)
983
+ if not parse_only:
984
+ f = Feature.from_root_fqn(variable)
985
+ default_arg = f.converter.from_json_to_rich(default_arg)
896
986
  default_args.append(default_arg)
897
987
  has_default_arg = True
898
988
  if not has_default_arg:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chalkpy
3
- Version: 2.96.0
3
+ Version: 2.96.1
4
4
  Summary: Python SDK for Chalk
5
5
  Author: Chalk AI, Inc.
6
6
  Project-URL: Homepage, https://chalk.ai
@@ -1,5 +1,5 @@
1
1
  chalk/__init__.py,sha256=vKsx9-cl5kImlVWGHVRYO6bweBm79NAzGs3l36u71wM,2657
2
- chalk/_version.py,sha256=VFVEmaCPCelx8c52gLAGDX2mvkTzbt9BnxqellL0CWM,23
2
+ chalk/_version.py,sha256=53oisDKLL-9FrciuE997yxhzB_eVulphF1oc5zt1rD8,23
3
3
  chalk/cli.py,sha256=ckqqfOI-A2mT23-rnZzDMmblYj-2x1VBX8ebHlIEn9A,5873
4
4
  chalk/importer.py,sha256=m4lMn1lSYj_euDq8CS7LYTBnek9JOcjGJf9-82dJHbA,64441
5
5
  chalk/prompts.py,sha256=2H9UomLAamdfRTNUdKs9i3VTpiossuyRhntqsAXUhhg,16117
@@ -193,6 +193,10 @@ chalk/_gen/chalk/engine/v2/feature_values_pb2.py,sha256=enBKvU-D_eVeY3at_g29_-tu
193
193
  chalk/_gen/chalk/engine/v2/feature_values_pb2.pyi,sha256=pVmjsH9_KUKS7SCF7PVwO6d7R2aMPn28RTU262mmbL0,4781
194
194
  chalk/_gen/chalk/engine/v2/feature_values_pb2_grpc.py,sha256=VCyAf0skoHSgQPkD4n8rKQPYesinqHqN8TEwyu7XGUo,159
195
195
  chalk/_gen/chalk/engine/v2/feature_values_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
196
+ chalk/_gen/chalk/engine/v2/introspection_service_pb2.py,sha256=CO4-cB9glhblVhG8omar9ZYcPAIJQBAdOKTp9t2jD8s,2621
197
+ chalk/_gen/chalk/engine/v2/introspection_service_pb2.pyi,sha256=lGJA1i5WZs-Y9eCjiBKqyoc0Q0xf5dwMo79Axi-W9wM,987
198
+ chalk/_gen/chalk/engine/v2/introspection_service_pb2_grpc.py,sha256=_R0b7rari7VXNjKOwfYPfj4U9z80rAibkRH0VcyP1-s,3000
199
+ chalk/_gen/chalk/engine/v2/introspection_service_pb2_grpc.pyi,sha256=cuIlTQVMgH-Ve5dJGz6AsgO9bxfgJdnTXjigUuKFCLM,909
196
200
  chalk/_gen/chalk/engine/v2/offline_store_service_pb2.py,sha256=ESIxkWWz3YDLVa8sBrCqzxzpRu80sF7iRtu1jwnY_Zg,3999
197
201
  chalk/_gen/chalk/engine/v2/offline_store_service_pb2.pyi,sha256=hKEmA909OMJaS4CYHJShkuUUua05hHWp1R11IhK3-VQ,684
198
202
  chalk/_gen/chalk/engine/v2/offline_store_service_pb2_grpc.py,sha256=hQBnBhagqeqVbg8uFDEVRDS5cTuH7BDkQN5TkdFSHKM,10022
@@ -743,7 +747,7 @@ chalk/sql/_internal/chalk_query.py,sha256=O2Mv0JHWvSrP3iDfkooy22yoDuWAH57m1i8qcy
743
747
  chalk/sql/_internal/incremental.py,sha256=xqnohrZIoqE3y92edUl_oEkHQoFZw9GN8GIOUynyyEI,2900
744
748
  chalk/sql/_internal/query_execution_parameters.py,sha256=FT0GixOryGeKR1x7UrQNoGFtySd_8-B4Xrp38nFi0FU,3679
745
749
  chalk/sql/_internal/query_registry.py,sha256=jOk2x9NvW2pZocI_iTvgd9DyOlr4-ajz8rTi0kkLSaI,3005
746
- chalk/sql/_internal/sql_file_resolver.py,sha256=BCGTpe3tVLQTWNSrfyUFsg8VfO-pupeN8yxGpiSmy5E,77817
750
+ chalk/sql/_internal/sql_file_resolver.py,sha256=0Ui8wRmkyzIBa929qYXwEqjrZ72N_QpVeH8foIGtfJ0,80822
747
751
  chalk/sql/_internal/sql_settings.py,sha256=9lcpHNrmEhr1Zxl_Ct7U0p0AbLUvlpSayxHEPmyqu8E,543
748
752
  chalk/sql/_internal/sql_source.py,sha256=083tGM7YzSsL-AhwTAtCzvGSjKxGVH_R5pILEpe5g1c,43825
749
753
  chalk/sql/_internal/sql_source_group.py,sha256=RIMEjEG3oSGwign37w9avpCRdVfVQepR8SPVv6JoOx0,5562
@@ -819,8 +823,8 @@ chalk/utils/tracing.py,sha256=NiiM-9dbuJhSCv6R1npR1uYNKWlkqTR6Ygm0Voi2NrY,13078
819
823
  chalk/utils/weak_set_by_identity.py,sha256=VmikA_laYwFeOphCwXJIuyOIkrdlQe0bSzaXq7onoQw,953
820
824
  chalk/utils/pydanticutil/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
821
825
  chalk/utils/pydanticutil/pydantic_compat.py,sha256=O575lLYJ5GvZC4HMzR9yATxf9XwjC6NrDUXbNwZidlE,3031
822
- chalkpy-2.96.0.dist-info/METADATA,sha256=h9BF0cHEBJti7iDvmLElN_TK1jm8NdIhpCaY5vez3_E,27754
823
- chalkpy-2.96.0.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
824
- chalkpy-2.96.0.dist-info/entry_points.txt,sha256=Vg23sd8icwq-morJrljVFr-kQnMbm95rZfZj5wsZGis,42
825
- chalkpy-2.96.0.dist-info/top_level.txt,sha256=1Q6_19IGYfNxSw50W8tYKEJ2t5HKQ3W9Wiw4ia5yg2c,6
826
- chalkpy-2.96.0.dist-info/RECORD,,
826
+ chalkpy-2.96.1.dist-info/METADATA,sha256=Yju64p2JSKrDw5doqpVwJk2-ePFHdTKDN6oKULBj3As,27754
827
+ chalkpy-2.96.1.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
828
+ chalkpy-2.96.1.dist-info/entry_points.txt,sha256=Vg23sd8icwq-morJrljVFr-kQnMbm95rZfZj5wsZGis,42
829
+ chalkpy-2.96.1.dist-info/top_level.txt,sha256=1Q6_19IGYfNxSw50W8tYKEJ2t5HKQ3W9Wiw4ia5yg2c,6
830
+ chalkpy-2.96.1.dist-info/RECORD,,