33from shexer .model .const_elem_types import IRI_ELEM_TYPE , BNODE_ELEM_TYPE , NONLITERAL_ELEM_TYPE
44from shexer .model .shape import STARTING_CHAR_FOR_SHAPE_NAME
55from shexer .utils .shapes import prefixize_shape_name_if_possible
6+ from shexer .utils .uri import prefixize_uri_if_possible
7+ from shexer .consts import FREQ_PROP
68
79_INVERSE_SENSE_SHEXC = "^"
10+ _ANNOTATION_BEGIN = "//"
11+ _FREQUENCY_PATTERN = "{:.3f}"
12+
813
914class BaseStatementSerializer (object ):
1015
11- def __init__ (self , instantiation_property_str , frequency_serializer , disable_comments = False , is_inverse = False ):
16+ def __init__ (self , instantiation_property_str , frequency_serializer , disable_comments = False , is_inverse = False ,
17+ frequency_property = FREQ_PROP ,
18+ namespaces_dict = None ,
19+ comments_to_annotations = False ):
1220 self ._instantiation_property_str = instantiation_property_str
1321 self ._disable_comments = disable_comments
1422 self ._is_inverse = is_inverse
1523 self ._frequency_serializer = frequency_serializer
24+ self ._frequency_property = frequency_property
25+ self ._namespaces_dict = namespaces_dict
26+ self ._comments_to_annotations = comments_to_annotations
1627
17- def serialize_statement_with_indent_level (self , a_statement , is_last_statement_of_shape , namespaces_dict ):
28+ def serialize_statement_with_indent_level (self , a_statement , is_last_statement_of_shape ):
1829 tuples_line_indent = []
19- st_property = BaseStatementSerializer .tune_token (a_statement .st_property , namespaces_dict )
30+ st_property = BaseStatementSerializer .tune_token (a_statement .st_property , self . _namespaces_dict )
2031 st_target_element = self .str_of_target_element (target_element = a_statement .st_type ,
21- st_property = a_statement .st_property ,
22- namespaces_dict = namespaces_dict )
32+ st_property = a_statement .st_property )
2333 cardinality = BaseStatementSerializer .cardinality_representation (
2434 statement = a_statement ,
2535 out_of_comment = True )
26- result = self ._sense_flag () + st_property + SPACES_GAP_BETWEEN_TOKENS + st_target_element + SPACES_GAP_BETWEEN_TOKENS + \
27- cardinality + BaseStatementSerializer .closure_of_statement (is_last_statement_of_shape )
28-
36+ if self ._comments_to_annotations :
37+ annotations = self ._build_constraint_annotations (a_statement )
38+ result = self ._sense_flag () + st_property + SPACES_GAP_BETWEEN_TOKENS + st_target_element + SPACES_GAP_BETWEEN_TOKENS + \
39+ cardinality + \
40+ SPACES_GAP_BETWEEN_TOKENS + annotations + SPACES_GAP_BETWEEN_TOKENS + \
41+ BaseStatementSerializer .closure_of_statement (is_last_statement_of_shape )
42+ else :
43+ result = self ._sense_flag () + st_property + SPACES_GAP_BETWEEN_TOKENS + st_target_element + SPACES_GAP_BETWEEN_TOKENS + \
44+ cardinality + \
45+ BaseStatementSerializer .closure_of_statement (is_last_statement_of_shape )
2946 if a_statement .cardinality not in [KLEENE_CLOSURE , OPT_CARDINALITY ] and not self ._disable_comments :
3047 result += BaseStatementSerializer .adequate_amount_of_final_spaces (result )
3148 result += a_statement .probability_representation ()
@@ -36,17 +53,26 @@ def serialize_statement_with_indent_level(self, a_statement, is_last_statement_o
3653
3754 return tuples_line_indent
3855
39- def str_of_target_element (self , target_element , st_property , namespaces_dict ):
56+ def _build_constraint_annotations (self , a_statement ):
57+ return SPACES_GAP_BETWEEN_TOKENS .join ((_ANNOTATION_BEGIN ,
58+ prefixize_uri_if_possible (target_uri = self ._frequency_property ,
59+ namespaces_prefix_dict = self ._namespaces_dict ,
60+ corners = False ),
61+ self ._format_frequency (a_statement .probability )
62+ ))
63+
64+ def _format_frequency (self , frequency_raw_number ):
65+ return _FREQUENCY_PATTERN .format (frequency_raw_number )
66+ def str_of_target_element (self , target_element , st_property ):
4067 """
4168 Special treatment for instantiation_property. We build a value set with an specific URI
4269 :param target_element:
4370 :param st_property:
44- :param namespaces_dict:
4571 :return:
4672 """
4773 if st_property == self ._instantiation_property_str :
48- return "[" + BaseStatementSerializer .tune_token (target_element , namespaces_dict ) + "]"
49- return BaseStatementSerializer .tune_token (target_element , namespaces_dict )
74+ return "[" + BaseStatementSerializer .tune_token (target_element , self . _namespaces_dict ) + "]"
75+ return BaseStatementSerializer .tune_token (target_element , self . _namespaces_dict )
5076
5177 @staticmethod
5278 def tune_token (a_token , namespaces_dict ):
0 commit comments