upgini 1.2.96a3__py3-none-any.whl → 1.2.96a3906.dev2__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.

Potentially problematic release.


This version of upgini might be problematic. Click here for more details.

upgini/__about__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "1.2.96a3"
1
+ __version__ = "1.2.96a3906.dev2"
upgini/autofe/unary.py CHANGED
@@ -190,3 +190,11 @@ class Bin(PandasOperator):
190
190
  if isinstance(value, str):
191
191
  return json.loads(value)
192
192
  return value
193
+
194
+
195
+ class Cluster(PandasOperator):
196
+ name: str = "cluster"
197
+ is_unary: bool = True
198
+ input_type: Optional[str] = "vector"
199
+ output_type: Optional[str] = "category"
200
+ is_categorical: bool = True
@@ -71,7 +71,10 @@ from upgini.search_task import SearchTask
71
71
  from upgini.spinner import Spinner
72
72
  from upgini.utils import combine_search_keys, find_numbers_with_decimal_comma
73
73
  from upgini.utils.blocked_time_series import BlockedTimeSeriesSplit
74
- from upgini.utils.country_utils import CountrySearchKeyDetector
74
+ from upgini.utils.country_utils import (
75
+ CountrySearchKeyConverter,
76
+ CountrySearchKeyDetector,
77
+ )
75
78
  from upgini.utils.custom_loss_utils import (
76
79
  get_additional_params_custom_loss,
77
80
  get_runtime_params_custom_loss,
@@ -102,8 +105,11 @@ from upgini.utils.feature_info import FeatureInfo, _round_shap_value
102
105
  from upgini.utils.features_validator import FeaturesValidator
103
106
  from upgini.utils.format import Format
104
107
  from upgini.utils.ip_utils import IpSearchKeyConverter
105
- from upgini.utils.phone_utils import PhoneSearchKeyDetector
106
- from upgini.utils.postal_code_utils import PostalCodeSearchKeyDetector
108
+ from upgini.utils.phone_utils import PhoneSearchKeyConverter, PhoneSearchKeyDetector
109
+ from upgini.utils.postal_code_utils import (
110
+ PostalCodeSearchKeyConverter,
111
+ PostalCodeSearchKeyDetector,
112
+ )
107
113
 
108
114
  try:
109
115
  from upgini.utils.progress_bar import CustomProgressBar as ProgressBar
@@ -1116,7 +1122,6 @@ class FeaturesEnricher(TransformerMixin):
1116
1122
  # and calculate final metric (and uplift)
1117
1123
  enriched_metric = None
1118
1124
  uplift = None
1119
- uplift_perc = None
1120
1125
  enriched_estimator = None
1121
1126
  if set(fitting_X.columns) != set(fitting_enriched_X.columns):
1122
1127
  self.logger.info(
@@ -1148,7 +1153,6 @@ class FeaturesEnricher(TransformerMixin):
1148
1153
  self.logger.info(f"Enriched {metric} on train combined features: {enriched_metric}")
1149
1154
  if baseline_metric is not None and enriched_metric is not None:
1150
1155
  uplift = (enriched_cv_result.metric - baseline_cv_result.metric) * multiplier
1151
- uplift_perc = uplift / abs(baseline_cv_result.metric) * 100
1152
1156
 
1153
1157
  train_metrics = {
1154
1158
  self.bundle.get("quality_metrics_segment_header"): self.bundle.get(
@@ -1175,10 +1179,7 @@ class FeaturesEnricher(TransformerMixin):
1175
1179
  enriched_metric
1176
1180
  )
1177
1181
  if uplift is not None:
1178
- train_metrics[self.bundle.get("quality_metrics_uplift_header")] = round(uplift, 3)
1179
- train_metrics[self.bundle.get("quality_metrics_uplift_perc_header")] = (
1180
- f"{round(uplift_perc, 1)}%"
1181
- )
1182
+ train_metrics[self.bundle.get("quality_metrics_uplift_header")] = uplift
1182
1183
  metrics = [train_metrics]
1183
1184
 
1184
1185
  # 3 If eval_set is presented - fit final model on train enriched data and score each
@@ -1227,10 +1228,8 @@ class FeaturesEnricher(TransformerMixin):
1227
1228
 
1228
1229
  if etalon_eval_metric is not None and enriched_eval_metric is not None:
1229
1230
  eval_uplift = (enriched_eval_results.metric - etalon_eval_results.metric) * multiplier
1230
- eval_uplift_perc = eval_uplift / abs(etalon_eval_results.metric) * 100
1231
1231
  else:
1232
1232
  eval_uplift = None
1233
- eval_uplift_perc = None
1234
1233
 
1235
1234
  eval_metrics = {
1236
1235
  self.bundle.get("quality_metrics_segment_header"): self.bundle.get(
@@ -1261,10 +1260,7 @@ class FeaturesEnricher(TransformerMixin):
1261
1260
  enriched_eval_metric
1262
1261
  )
1263
1262
  if eval_uplift is not None:
1264
- eval_metrics[self.bundle.get("quality_metrics_uplift_header")] = round(eval_uplift, 3)
1265
- eval_metrics[self.bundle.get("quality_metrics_uplift_perc_header")] = (
1266
- f"{round(eval_uplift_perc, 1)}%"
1267
- )
1263
+ eval_metrics[self.bundle.get("quality_metrics_uplift_header")] = eval_uplift
1268
1264
 
1269
1265
  metrics.append(eval_metrics)
1270
1266
 
@@ -2499,6 +2495,21 @@ if response.status_code == 200:
2499
2495
  )
2500
2496
  df = converter.convert(df)
2501
2497
 
2498
+ phone_column = self._get_phone_column(search_keys)
2499
+ country_column = self._get_country_column(search_keys)
2500
+ if phone_column:
2501
+ converter = PhoneSearchKeyConverter(phone_column, country_column)
2502
+ df = converter.convert(df)
2503
+
2504
+ if country_column:
2505
+ converter = CountrySearchKeyConverter(country_column)
2506
+ df = converter.convert(df)
2507
+
2508
+ postal_code = self._get_postal_column(search_keys)
2509
+ if postal_code:
2510
+ converter = PostalCodeSearchKeyConverter(postal_code)
2511
+ df = converter.convert(df)
2512
+
2502
2513
  meaning_types = {}
2503
2514
  meaning_types.update({col: FileColumnMeaningType.FEATURE for col in features_for_transform})
2504
2515
  meaning_types.update({col: key.value for col, key in search_keys.items()})
@@ -2893,7 +2904,6 @@ if response.status_code == 200:
2893
2904
  self.fit_generated_features.extend(converter.generated_features)
2894
2905
  else:
2895
2906
  self.logger.info("Input dataset hasn't date column")
2896
- # TODO remove when this logic will be implemented on the back
2897
2907
  if self.__should_add_date_column():
2898
2908
  df = self._add_current_date_as_key(df, self.fit_search_keys, self.logger, self.bundle)
2899
2909
 
@@ -2925,26 +2935,6 @@ if response.status_code == 200:
2925
2935
  if normalizer.removed_features:
2926
2936
  self.__log_warning(self.bundle.get("dataset_date_features").format(normalizer.removed_features))
2927
2937
 
2928
- non_feature_columns = [
2929
- self.TARGET_NAME,
2930
- EVAL_SET_INDEX,
2931
- ] + list(self.fit_search_keys.keys())
2932
- if DateTimeSearchKeyConverter.DATETIME_COL in df.columns:
2933
- non_feature_columns.append(DateTimeSearchKeyConverter.DATETIME_COL)
2934
-
2935
- features_columns = [c for c in df.columns if c not in non_feature_columns]
2936
-
2937
- features_to_drop, feature_validator_warnings = FeaturesValidator(self.logger).validate(
2938
- df, features_columns, self.generate_features, self.fit_columns_renaming
2939
- )
2940
- if feature_validator_warnings:
2941
- for warning in feature_validator_warnings:
2942
- self.__log_warning(warning)
2943
- self.fit_dropped_features.update(features_to_drop)
2944
- df = df.drop(columns=features_to_drop)
2945
-
2946
- self.fit_generated_features = [f for f in self.fit_generated_features if f not in self.fit_dropped_features]
2947
-
2948
2938
  self.__adjust_cv(df)
2949
2939
 
2950
2940
  if self.id_columns is not None and self.cv is not None and self.cv.is_time_series():
@@ -2984,7 +2974,6 @@ if response.status_code == 200:
2984
2974
  # Convert EMAIL to HEM etc after unnesting to do it only with one column
2985
2975
  df = self.__convert_unnestable_keys(df, unnest_search_keys)
2986
2976
 
2987
- # refresh features columns
2988
2977
  non_feature_columns = [
2989
2978
  self.TARGET_NAME,
2990
2979
  EVAL_SET_INDEX,
@@ -2996,6 +2985,17 @@ if response.status_code == 200:
2996
2985
 
2997
2986
  features_columns = [c for c in df.columns if c not in non_feature_columns]
2998
2987
 
2988
+ features_to_drop, feature_validator_warnings = FeaturesValidator(self.logger).validate(
2989
+ df, features_columns, self.generate_features, self.fit_columns_renaming
2990
+ )
2991
+ if feature_validator_warnings:
2992
+ for warning in feature_validator_warnings:
2993
+ self.__log_warning(warning)
2994
+ self.fit_dropped_features.update(features_to_drop)
2995
+ df = df.drop(columns=features_to_drop)
2996
+
2997
+ self.fit_generated_features = [f for f in self.fit_generated_features if f not in self.fit_dropped_features]
2998
+
2999
2999
  meaning_types = {
3000
3000
  **{col: key.value for col, key in self.fit_search_keys.items()},
3001
3001
  **{str(c): FileColumnMeaningType.FEATURE for c in df.columns if c not in non_feature_columns},
@@ -3225,6 +3225,20 @@ if response.status_code == 200:
3225
3225
  self.logger,
3226
3226
  )
3227
3227
  df = converter.convert(df)
3228
+ phone_column = self._get_phone_column(self.fit_search_keys)
3229
+ country_column = self._get_country_column(self.fit_search_keys)
3230
+ if phone_column:
3231
+ converter = PhoneSearchKeyConverter(phone_column, country_column)
3232
+ df = converter.convert(df)
3233
+
3234
+ if country_column:
3235
+ converter = CountrySearchKeyConverter(country_column)
3236
+ df = converter.convert(df)
3237
+
3238
+ postal_code = self._get_postal_column(self.fit_search_keys)
3239
+ if postal_code:
3240
+ converter = PostalCodeSearchKeyConverter(postal_code)
3241
+ df = converter.convert(df)
3228
3242
 
3229
3243
  return df
3230
3244
 
@@ -24,11 +24,8 @@ from upgini.metadata import (
24
24
  )
25
25
  from upgini.resource_bundle import ResourceBundle, get_custom_bundle
26
26
  from upgini.utils import find_numbers_with_decimal_comma
27
- from upgini.utils.country_utils import CountrySearchKeyConverter
28
27
  from upgini.utils.datetime_utils import DateTimeSearchKeyConverter
29
- from upgini.utils.ip_utils import IpSearchKeyConverter
30
28
  from upgini.utils.phone_utils import PhoneSearchKeyConverter
31
- from upgini.utils.postal_code_utils import PostalCodeSearchKeyConverter
32
29
 
33
30
 
34
31
  class Normalizer:
@@ -68,12 +65,6 @@ class Normalizer:
68
65
 
69
66
  df = self._convert_phone_numbers(df)
70
67
 
71
- df = self._convert_ip_addresses(df)
72
-
73
- df = self._convert_postal_codes(df)
74
-
75
- df = self._convert_countries(df)
76
-
77
68
  df = self.__convert_features_types(df)
78
69
 
79
70
  return df, self.search_keys, self.generated_features
@@ -83,33 +74,19 @@ class Normalizer:
83
74
  new_columns = []
84
75
  dup_counter = 0
85
76
  for column in df.columns:
86
- if (
87
- column
88
- in [
89
- TARGET,
90
- EVAL_SET_INDEX,
91
- SYSTEM_RECORD_ID,
92
- ENTITY_SYSTEM_RECORD_ID,
93
- SEARCH_KEY_UNNEST,
94
- DateTimeSearchKeyConverter.DATETIME_COL,
95
- ]
96
- ):
77
+ if column in [
78
+ TARGET,
79
+ EVAL_SET_INDEX,
80
+ SYSTEM_RECORD_ID,
81
+ ENTITY_SYSTEM_RECORD_ID,
82
+ SEARCH_KEY_UNNEST,
83
+ DateTimeSearchKeyConverter.DATETIME_COL,
84
+ ]:
97
85
  self.columns_renaming[column] = column
98
86
  new_columns.append(column)
99
87
  continue
100
88
 
101
- new_column = str(column)
102
- suffix = hashlib.sha256(new_column.encode()).hexdigest()[:6]
103
- if len(new_column) == 0:
104
- raise ValidationError(self.bundle.get("dataset_empty_column_names"))
105
- # db limit for column length
106
- if len(new_column) > 250:
107
- new_column = new_column[:250]
108
-
109
- # make column name unique relative to server features
110
- new_column = f"{new_column}_{suffix}"
111
-
112
- new_column = new_column.lower()
89
+ new_column = add_hash_suffix(column, self.bundle)
113
90
 
114
91
  # if column starts with non alphabetic symbol then add "a" to the beginning of string
115
92
  if ord(new_column[0]) not in range(ord("a"), ord("z") + 1):
@@ -200,22 +177,6 @@ class Normalizer:
200
177
  df = converter.convert(df)
201
178
  return df
202
179
 
203
- def _convert_ip_addresses(self, df: pd.DataFrame) -> pd.DataFrame:
204
- for ip_col in SearchKey.find_all_keys(self.search_keys, SearchKey.IP):
205
- df[ip_col] = df[ip_col].apply(IpSearchKeyConverter.safe_ip_parse)
206
- return df
207
-
208
- def _convert_postal_codes(self, df: pd.DataFrame) -> pd.DataFrame:
209
- for postal_code_col in SearchKey.find_all_keys(self.search_keys, SearchKey.POSTAL_CODE):
210
- df = PostalCodeSearchKeyConverter(postal_code_col).convert(df)
211
- return df
212
-
213
- def _convert_countries(self, df: pd.DataFrame) -> pd.DataFrame:
214
- maybe_country_col = SearchKey.find_key(self.search_keys, SearchKey.COUNTRY)
215
- if maybe_country_col:
216
- df = CountrySearchKeyConverter(maybe_country_col).convert(df)
217
- return df
218
-
219
180
  def __convert_features_types(self, df: pd.DataFrame):
220
181
  # self.logger.info("Convert features to supported data types")
221
182
 
@@ -223,3 +184,19 @@ class Normalizer:
223
184
  if not is_numeric_dtype(df[f]):
224
185
  df[f] = df[f].astype("string")
225
186
  return df
187
+
188
+
189
+ def add_hash_suffix(column: str, bundle: ResourceBundle | None = None) -> str:
190
+ new_column = str(column)
191
+ suffix = hashlib.sha256(new_column.encode()).hexdigest()[:6]
192
+ if bundle is not None and len(new_column) == 0:
193
+ raise ValidationError(bundle.get("dataset_empty_column_names"))
194
+ # db limit for column length
195
+ if len(new_column) > 250:
196
+ new_column = new_column[:250]
197
+
198
+ # make column name unique relative to server features
199
+ new_column = f"{new_column}_{suffix}"
200
+
201
+ new_column = new_column.lower()
202
+ return new_column
@@ -284,8 +284,8 @@ quality_metrics_segment_header=Dataset type
284
284
  quality_metrics_match_rate_header=Match rate
285
285
  quality_metrics_baseline_header=Baseline {}
286
286
  quality_metrics_enriched_header=Enriched {}
287
- quality_metrics_uplift_header=Uplift, abs
288
- quality_metrics_uplift_perc_header=Uplift, %
287
+ quality_metrics_uplift_header=Uplift
288
+ quality_metrics_uplift_prc_header=Uplift, %
289
289
 
290
290
  # Legacy native api messages
291
291
  dataset_dataframe_or_path_empty=Either `df` or `path` must be provided
upgini/utils/ip_utils.py CHANGED
@@ -79,7 +79,7 @@ class IpSearchKeyConverter:
79
79
  pass
80
80
 
81
81
  @staticmethod
82
- def safe_ip_parse(ip: Union[str, int, IPv4Address, IPv6Address, bytes]) -> Optional[_BaseAddress]:
82
+ def _safe_ip_parse(ip: Union[str, int, IPv4Address, IPv6Address]) -> Optional[_BaseAddress]:
83
83
  try:
84
84
  return ip_address(ip)
85
85
  except ValueError:
@@ -110,7 +110,7 @@ class IpSearchKeyConverter:
110
110
  self.logger.info("Convert ip address to int")
111
111
  original_ip = self.columns_renaming[self.ip_column]
112
112
 
113
- df[self.ip_column] = df[self.ip_column].apply(self.safe_ip_parse)
113
+ df[self.ip_column] = df[self.ip_column].apply(self._safe_ip_parse)
114
114
  if df[self.ip_column].isnull().all():
115
115
  raise ValidationError(self.bundle.get("invalid_ip").format(self.ip_column))
116
116
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: upgini
3
- Version: 1.2.96a3
3
+ Version: 1.2.96a3906.dev2
4
4
  Summary: Intelligent data search & enrichment for Machine Learning
5
5
  Project-URL: Bug Reports, https://github.com/upgini/upgini/issues
6
6
  Project-URL: Homepage, https://upgini.com/
@@ -1,9 +1,9 @@
1
- upgini/__about__.py,sha256=euNfF4usca0xoZtvXArti-DB6GH8wgwXSYVRRbwzMkE,25
1
+ upgini/__about__.py,sha256=8ZaMc0M4yKUigIQciHTdkff0EFfiqt8pmRDvJz70MsQ,33
2
2
  upgini/__init__.py,sha256=LXSfTNU0HnlOkE69VCxkgIKDhWP-JFo_eBQ71OxTr5Y,261
3
3
  upgini/ads.py,sha256=nvuRxRx5MHDMgPr9SiU-fsqRdFaBv8p4_v1oqiysKpc,2714
4
4
  upgini/dataset.py,sha256=e6JDYTZ2AwC5aF-dqclKZKkiKrHo2f6cFmMQO2ZZmjM,32724
5
5
  upgini/errors.py,sha256=2b_Wbo0OYhLUbrZqdLIx5jBnAsiD1Mcenh-VjR4HCTw,950
6
- upgini/features_enricher.py,sha256=dGB4utdlCtgILwX1Hnchg066fwwoyItPBSyzoPe64Z8,218244
6
+ upgini/features_enricher.py,sha256=DFBA-3_yZSDcvJnfZjPCvNFFSC8OZwDl992-dlathm0,218432
7
7
  upgini/http.py,sha256=4i7fQwrwU3WzDUOWzrgR-4C8eJwj_5dBwRAR-UjUtlc,44345
8
8
  upgini/metadata.py,sha256=vsbbHyPCP3Rs8WkeDgQg99uAA_zmsbDStAT-NwDYhO4,12455
9
9
  upgini/metrics.py,sha256=UbKEsHB7XDzoyGNqDx846zbh1t65GpqdnnhViccdoKU,45615
@@ -19,7 +19,7 @@ upgini/autofe/date.py,sha256=MM1S-6imNSzCDOhbNnmsc_bwSqUWBcS8vWAdHF8j1kY,11134
19
19
  upgini/autofe/feature.py,sha256=cu4xXjzVVF13ZV4RxuTrysK2qCfezlRCMOzCKRo1rNs,15558
20
20
  upgini/autofe/groupby.py,sha256=IYmQV9uoCdRcpkeWZj_kI3ObzoNCNx3ff3h8sTL01tk,3603
21
21
  upgini/autofe/operator.py,sha256=EOffJw6vKXpEh5yymqb1RFNJPxGxmnHdFRo9dB5SCFo,4969
22
- upgini/autofe/unary.py,sha256=Sx11IoHRh5nwyALzjgG9GQOrVNIs8NZ1JzunAJuN66A,5731
22
+ upgini/autofe/unary.py,sha256=N76Pehn-hO8FWlSdqJ2Wm-yoU1MSR7m6yb2GWYBcumU,5933
23
23
  upgini/autofe/utils.py,sha256=dYrtyAM8Vcc_R8u4dNo54IsGrHKagTHDJTKhGho0bRg,2967
24
24
  upgini/autofe/vector.py,sha256=jHs0nNTOaHspYUlxW7fjQepk4cvr_JDQ65L1OCiVsds,1360
25
25
  upgini/autofe/timeseries/__init__.py,sha256=PGwwDAMwvkXl3el12tXVEmZUgDUvlmIPlXtROm6bD18,738
@@ -35,10 +35,10 @@ upgini/data_source/data_source_publisher.py,sha256=ufL8qK1vg8iUKd5bLWz6hEMGiC3Je
35
35
  upgini/mdc/__init__.py,sha256=iHJlXQg6xRM1-ZOUtaPSJqw5SpQDszvxp4LyqviNLIQ,1027
36
36
  upgini/mdc/context.py,sha256=3u1B-jXt7tXEvNcV3qmR9SDCseudnY7KYsLclBdwVLk,1405
37
37
  upgini/normalizer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
- upgini/normalizer/normalize_utils.py,sha256=BSP0vIjRPrupL1sziAudPXJ-qsO4UE9Pyhwiqa1MZV8,8484
38
+ upgini/normalizer/normalize_utils.py,sha256=hMHi5u6Oleqp885UW0Q0Uf1F8fRdZ5jJ7NYoY52SqaI,7403
39
39
  upgini/resource_bundle/__init__.py,sha256=S5F2G47pnJd2LDpmFsjDqEwiKkP8Hm-hcseDbMka6Ko,8345
40
40
  upgini/resource_bundle/exceptions.py,sha256=5fRvx0_vWdE1-7HcSgF0tckB4A9AKyf5RiinZkInTsI,621
41
- upgini/resource_bundle/strings.properties,sha256=UO6K0wwvutyOyClOnJYlFYAETzMSen6hHnj3--5AIAs,28497
41
+ upgini/resource_bundle/strings.properties,sha256=Hfpr2-I5Ws6ugIN1QSz549OHayZeLYglRsbrGDT6g9g,28491
42
42
  upgini/resource_bundle/strings_widget.properties,sha256=gOdqvZWntP2LCza_tyVk1_yRYcG4c04K9sQOAVhF_gw,1577
43
43
  upgini/sampler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
44
  upgini/sampler/base.py,sha256=7GpjYqjOp58vYcJLiX__1R5wjUlyQbxvHJ2klFnup_M,6389
@@ -59,7 +59,7 @@ upgini/utils/fallback_progress_bar.py,sha256=PDaKb8dYpVZaWMroNcOHsTc3pSjgi9mOm0-
59
59
  upgini/utils/feature_info.py,sha256=b3RvAeOHSEu-ZXWTrf42Dll_3ZUBL0pw7sdk7hgUKD0,7284
60
60
  upgini/utils/features_validator.py,sha256=lEfmk4DoxZ4ooOE1HC0ZXtUb_lFKRFHIrnFULZ4_rL8,3746
61
61
  upgini/utils/format.py,sha256=Yv5cvvSs2bOLUzzNu96Pu33VMDNbabio92QepUj41jU,243
62
- upgini/utils/ip_utils.py,sha256=wmnnwVQdjX9o1cNQw6VQMk6maHhvsq6hNsZBYf9knrw,6585
62
+ upgini/utils/ip_utils.py,sha256=TSQ_qDsLlVnm09X1HacpabEf_HNqSWpxBF4Sdc2xs08,6580
63
63
  upgini/utils/mstats.py,sha256=u3gQVUtDRbyrOQK6V1UJ2Rx1QbkSNYGjXa6m3Z_dPVs,6286
64
64
  upgini/utils/phone_utils.py,sha256=IrbztLuOJBiePqqxllfABWfYlfAjYevPhXKipl95wUI,10432
65
65
  upgini/utils/postal_code_utils.py,sha256=5M0sUqH2DAr33kARWCTXR-ACyzWbjDq_-0mmEml6ZcU,1716
@@ -71,7 +71,7 @@ upgini/utils/target_utils.py,sha256=i3Xt5l9ybB2_nF_ma5cfPuL3OeFTs2dY2xDI0p4Azpg,
71
71
  upgini/utils/track_info.py,sha256=G5Lu1xxakg2_TQjKZk4b5SvrHsATTXNVV3NbvWtT8k8,5663
72
72
  upgini/utils/ts_utils.py,sha256=26vhC0pN7vLXK6R09EEkMK3Lwb9IVPH7LRdqFIQ3kPs,1383
73
73
  upgini/utils/warning_counter.py,sha256=-GRY8EUggEBKODPSuXAkHn9KnEQwAORC0mmz_tim-PM,254
74
- upgini-1.2.96a3.dist-info/METADATA,sha256=HdJ2Ptri3J0BuSdc6tXhBZ79vpGvbKIuPx5PVLrtTeY,49530
75
- upgini-1.2.96a3.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
76
- upgini-1.2.96a3.dist-info/licenses/LICENSE,sha256=5RRzgvdJUu3BUDfv4bzVU6FqKgwHlIay63pPCSmSgzw,1514
77
- upgini-1.2.96a3.dist-info/RECORD,,
74
+ upgini-1.2.96a3906.dev2.dist-info/METADATA,sha256=IiF040yVE4K20_1kus6Y4tzj6rDeA2X8kYkhJ0_Kxr8,49538
75
+ upgini-1.2.96a3906.dev2.dist-info/WHEEL,sha256=zEMcRr9Kr03x1ozGwg5v9NQBKn3kndp6LSoSlVg-jhU,87
76
+ upgini-1.2.96a3906.dev2.dist-info/licenses/LICENSE,sha256=5RRzgvdJUu3BUDfv4bzVU6FqKgwHlIay63pPCSmSgzw,1514
77
+ upgini-1.2.96a3906.dev2.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.25.0
2
+ Generator: hatchling 1.24.2
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any