upgini 1.2.96a3__py3-none-any.whl → 1.2.96a3906.dev1__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 +1 -1
- upgini/autofe/unary.py +8 -0
- upgini/features_enricher.py +51 -37
- upgini/normalizer/normalize_utils.py +0 -25
- upgini/resource_bundle/strings.properties +2 -2
- upgini/utils/ip_utils.py +2 -2
- {upgini-1.2.96a3.dist-info → upgini-1.2.96a3906.dev1.dist-info}/METADATA +1 -1
- {upgini-1.2.96a3.dist-info → upgini-1.2.96a3906.dev1.dist-info}/RECORD +10 -10
- {upgini-1.2.96a3.dist-info → upgini-1.2.96a3906.dev1.dist-info}/WHEEL +1 -1
- {upgini-1.2.96a3.dist-info → upgini-1.2.96a3906.dev1.dist-info}/licenses/LICENSE +0 -0
upgini/__about__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "1.2.
|
1
|
+
__version__ = "1.2.96a3906.dev1"
|
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
|
upgini/features_enricher.py
CHANGED
@@ -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
|
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
|
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")] =
|
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")] =
|
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
|
@@ -200,22 +191,6 @@ class Normalizer:
|
|
200
191
|
df = converter.convert(df)
|
201
192
|
return df
|
202
193
|
|
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
194
|
def __convert_features_types(self, df: pd.DataFrame):
|
220
195
|
# self.logger.info("Convert features to supported data types")
|
221
196
|
|
@@ -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
|
288
|
-
|
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
|
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.
|
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,9 +1,9 @@
|
|
1
|
-
upgini/__about__.py,sha256=
|
1
|
+
upgini/__about__.py,sha256=PUiYzCofvZt-NqYbWaNaLcmWYA89yEpQxOLTh8v2lac,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=
|
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=
|
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=
|
38
|
+
upgini/normalizer/normalize_utils.py,sha256=g2TcDXZeJp9kAFO2sTqZ4CAsN4J1qHNgoJHZ8gtzUWo,7376
|
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=
|
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=
|
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.
|
75
|
-
upgini-1.2.
|
76
|
-
upgini-1.2.
|
77
|
-
upgini-1.2.
|
74
|
+
upgini-1.2.96a3906.dev1.dist-info/METADATA,sha256=tsYVKpMvgRQC8vNFCNlPhKvjxD8mysNzj7E4BWM18Gc,49538
|
75
|
+
upgini-1.2.96a3906.dev1.dist-info/WHEEL,sha256=zEMcRr9Kr03x1ozGwg5v9NQBKn3kndp6LSoSlVg-jhU,87
|
76
|
+
upgini-1.2.96a3906.dev1.dist-info/licenses/LICENSE,sha256=5RRzgvdJUu3BUDfv4bzVU6FqKgwHlIay63pPCSmSgzw,1514
|
77
|
+
upgini-1.2.96a3906.dev1.dist-info/RECORD,,
|
File without changes
|