@@ -16,6 +16,7 @@ def _variables(meta: Any, names: list[str]) -> list[dict[str, Any]]:
1616 labels = dict (getattr (meta , "column_names_to_labels" , {}) or {})
1717 formats = dict (getattr (meta , "original_variable_types" , {}) or {})
1818 measures = dict (getattr (meta , "variable_measure" , {}) or {})
19+ alignments = dict (getattr (meta , "variable_alignment" , {}) or {})
1920 displays = dict (getattr (meta , "variable_display_width" , {}) or {})
2021 value_labels = dict (getattr (meta , "variable_value_labels" , {}) or {})
2122 missing_ranges = dict (getattr (meta , "missing_ranges" , {}) or {})
@@ -28,7 +29,8 @@ def _variables(meta: Any, names: list[str]) -> list[dict[str, Any]]:
2829 "physical_name" : physical_name (source_name , used ), "storage_kind" : kind ,
2930 "string_width" : widths .get (source_name ) if kind == "string" else None ,
3031 "label" : labels .get (source_name , "" ) or "" , "format" : formats .get (source_name ),
31- "measure" : measures .get (source_name ), "display_width" : displays .get (source_name ),
32+ "measure" : measures .get (source_name ), "alignment" : alignments .get (source_name ),
33+ "display_width" : displays .get (source_name ),
3234 "value_labels" : json .dumps (value_labels .get (source_name , {}), sort_keys = True ),
3335 "missing_ranges" : json .dumps (missing_ranges .get (source_name , []), default = str ),
3436 })
@@ -69,6 +71,8 @@ def import_sav_dataset(*, source: str | Path, database_url: str, dataset_id: str
6971 database_url = database_url , dataset_id = dataset_id , source_name = source_path .name ,
7072 source_format = source_path .suffix [1 :].upper (), rows = _rows (frame , variables ),
7173 variables = variables , file_label = getattr (meta , "file_label" , "" ) or "" ,
74+ source_encoding = getattr (meta , "file_encoding" , None ),
75+ documents = json .dumps (list (getattr (meta , "notes" , []) or [])),
7276 )
7377 return {** result , "loss_report" : LossReport ().events }
7478
@@ -87,6 +91,10 @@ def export_sav_dataset(*, database_url: str, dataset_id: str, destination: str |
8791 formats = {item ["source_name" ]: item ["format" ] for item in variables if item ["format" ]}
8892 measures = {item ["source_name" ]: item ["measure" ] for item in variables if item ["measure" ]}
8993 displays = {item ["source_name" ]: item ["display_width" ] for item in variables if item ["display_width" ]}
94+ missing_ranges = {
95+ item ["source_name" ]: json .loads (item ["missing_ranges" ])
96+ for item in variables if item ["missing_ranges" ] != "[]"
97+ }
9098 value_labels = {
9199 item ["source_name" ]: {(float (key ) if item ["storage_kind" ] == "numeric" else key ): value for key , value in json .loads (item ["value_labels" ]).items ()}
92100 for item in variables if item ["value_labels" ] != "{}"
@@ -95,10 +103,11 @@ def export_sav_dataset(*, database_url: str, dataset_id: str, destination: str |
95103 frame , destination_path , file_label = dataset ["file_label" ], column_labels = labels ,
96104 variable_format = formats , variable_measure = measures ,
97105 variable_display_width = displays , variable_value_labels = value_labels ,
106+ missing_ranges = missing_ranges , note = json .loads (dataset ["documents" ]),
98107 )
99108 return {
100109 "dataset_id" : dataset_id , "destination" : str (destination_path ),
101- "loss_report" : ({ "code" : "missing-ranges-not-exported" , "detail" : "The initial writer does not preserve user-missing ranges." },) ,
110+ "loss_report" : LossReport (). events ,
102111 }
103112
104113
0 commit comments