yeref 0.24.98__py3-none-any.whl → 0.24.99__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.
yeref/yeref.py CHANGED
@@ -16011,133 +16011,108 @@ async def calc_metrics(bot, PROJECT_USERNAME, dataroom_folder_id, EXTRA_D, BASE_
16011
16011
  r4 = await return_retention_metrics(bot, data_users, EXTRA_D)
16012
16012
  r5 = await return_profit_and_loss_metrics(bot, data_users, EXTRA_D)
16013
16013
 
16014
- if r1 and os.path.isfile(r1):
16015
- # 1) Авторизация в Google Sheets
16016
- scopes = r_conf('scopes', CONF_P)
16017
- credential_path = os.path.join(EXTRA_D, (r_conf('credential_file', CONF_P))[0])
16018
- credentials = ServiceAccountCredentials.from_json_keyfile_name(credential_path, scopes)
16019
- http_auth = credentials.authorize(httplib2.Http())
16020
- sheets_service = build('sheets', 'v4', http=http_auth, cache_discovery=False)
16021
-
16022
- # 2) Получаем metadata всей таблицы и ищем лист «Лист1»/«Sheet1» для переименования
16023
- spreadsheet = sheets_service.spreadsheets().get(spreadsheetId=dataroom_folder_id).execute()
16024
- logger.info(f"До переименования. Найдено листов: {len(spreadsheet.get('sheets', []))}")
16025
- for sheet in spreadsheet.get('sheets', []):
16026
- props = sheet.get('properties', {})
16027
- logger.info(f" • sheetId={props.get('sheetId')} title='{props.get('title')}'")
16028
-
16029
- sheet_id_to_rename = None
16030
- original_title = None
16031
- for sheet in spreadsheet.get('sheets', []):
16032
- props = sheet.get('properties', {})
16033
- title = props.get('title', '')
16034
- if title in ['Лист1', 'Sheet1']:
16035
- sheet_id_to_rename = props.get('sheetId')
16036
- original_title = title
16037
- logger.info(f"Найден лист для переименования: sheetId={sheet_id_to_rename}, title='{title}'")
16038
- break
16014
+ # --- Начинаем сразу с объединённого цикла по всем метрикам r1–r5 ---
16015
+ metrics_paths = [r1, r2, r3, r4, r5]
16016
+ tables = [] # сюда будем складывать словари вида {'name': basename, 'rows': [[...], ...]}
16017
+
16018
+ # 1) Собираем существующие CSV-файлы
16019
+ for path in metrics_paths:
16020
+ if path and os.path.isfile(path):
16021
+ basename = os.path.basename(path)
16022
+ with open(path, newline='', encoding='utf-8') as csvfile:
16023
+ reader = csv.reader(csvfile)
16024
+ rows = list(reader)
16025
+ logger.info(f"Найден файл '{basename}', строк = {len(rows)}.")
16026
+ tables.append({'name': basename, 'rows': rows})
16027
+ else:
16028
+ logger.warning(f"Файл не найден или не существует: {path}")
16039
16029
 
16040
- if sheet_id_to_rename is not None:
16041
- rename_request = {
16042
- 'requests': [
16043
- {
16044
- 'updateSheetProperties': {
16045
- 'properties': {
16046
- 'sheetId': sheet_id_to_rename,
16047
- 'title': PROJECT_USERNAME
16048
- },
16049
- 'fields': 'title'
16050
- }
16051
- }
16052
- ]
16053
- }
16054
- sheets_service.spreadsheets().batchUpdate(
16055
- spreadsheetId=dataroom_folder_id,
16056
- body=rename_request
16057
- ).execute()
16058
- logger.info(f"Запрос на переименование отправлен: '{original_title}' → '{PROJECT_USERNAME}'")
16059
-
16060
- # Проверим изменения
16061
- spreadsheet_after = sheets_service.spreadsheets().get(spreadsheetId=dataroom_folder_id).execute()
16062
- logger.info("После переименования. Список листов теперь:")
16063
- for sheet in spreadsheet_after.get('sheets', []):
16064
- props = sheet.get('properties', {})
16065
- logger.info(f" • sheetId={props.get('sheetId')} title='{props.get('title')}'")
16066
- else:
16067
- logger.warning("Не найден лист с названием 'Лист1' или 'Sheet1' — пропускаем переименование.")
16068
-
16069
- # 3) Подготовим список «таблиц» (r1–r5). Пробежимся по каждому r и, если файл существует, прочитаем его
16070
- table_paths = [
16071
- r1,
16072
- r2 if 'r2' in locals() else None,
16073
- r3 if 'r3' in locals() else None,
16074
- r4 if 'r4' in locals() else None,
16075
- r5 if 'r5' in locals() else None,
16076
- ]
16077
- tables = [] # будет список словарей { 'name': basename, 'rows': [[...], ...] }
16078
- for idx, path in enumerate(table_paths, start=1):
16079
- if path and os.path.isfile(path):
16080
- basename = os.path.basename(path)
16081
- with open(path, newline='', encoding='utf-8') as csvfile:
16082
- reader = csv.reader(csvfile)
16083
- rows = list(reader)
16084
- logger.info(f"Для таблицы #{idx}: найден файл '{basename}', строк = {len(rows)}.")
16085
- tables.append({'name': basename, 'rows': rows})
16086
- else:
16087
- logger.warning(f"Таблица #{idx}: файл не найден или не существует: {path}")
16030
+ # 2) Если ни одного CSV не обнаружено, выходим
16031
+ if not tables:
16032
+ logger.warning("Ни один CSV-файл не найден. Прерываем запись.")
16033
+ else:
16034
+ # 3) Авторизация в Google Sheets
16035
+ scopes = r_conf('scopes', CONF_P)
16036
+ credential_path = os.path.join(EXTRA_D, (r_conf('credential_file', CONF_P))[0])
16037
+ credentials = ServiceAccountCredentials.from_json_keyfile_name(credential_path, scopes)
16038
+ http_auth = credentials.authorize(httplib2.Http())
16039
+ sheets_service = build('sheets', 'v4', http=http_auth, cache_discovery=False)
16088
16040
 
16089
- if not tables:
16090
- logger.warning("Ни один CSV-файл (r1–r5) не найден. Прерываем запись.")
16091
- else:
16092
- # 4) Вычисляем, куда вставлять каждый блок: начинаем с 1-й строки
16093
- # и гарантируем между таблицами минимум 2 пустые строки
16094
- safe_title = PROJECT_USERNAME.replace("'", "\\'")
16095
- offset = 1 # строка, с которой вставляем следующий блок
16096
- data_requests = []
16097
-
16098
- for tbl in tables:
16099
- # 4.1) Вставляем название файла (одна строка)
16100
- header_range = f"'{safe_title}'!A{offset}"
16101
- data_requests.append({
16102
- 'range': header_range,
16103
- 'majorDimension': 'ROWS',
16104
- 'values': [[tbl['name']]]
16105
- })
16106
- logger.info(f"Добавили запрос на запись заголовка '{tbl['name']}' в A{offset}.")
16107
- offset += 1
16108
-
16109
- # 4.2) Вставляем саму таблицу (все строки CSV) сразу под названием
16110
- data_range = f"'{safe_title}'!A{offset}"
16111
- data_requests.append({
16112
- 'range': data_range,
16113
- 'majorDimension': 'ROWS',
16114
- 'values': tbl['rows']
16115
- })
16116
- logger.info(
16117
- f"Добавили запрос на запись {len(tbl['rows'])} строк таблицы '{tbl['name']}' в A{offset}.")
16118
- offset += len(tbl['rows'])
16119
-
16120
- # 4.3) Оставляем минимум 2 пустые строки перед следующей таблицей
16121
- offset += 2
16122
-
16123
- # 5) Выполняем единственный batchUpdate с all data_requests
16124
- write_body = {
16125
- 'valueInputOption': 'USER_ENTERED',
16126
- 'data': data_requests
16127
- }
16128
- try:
16129
- response = sheets_service.spreadsheets().values().batchUpdate(
16130
- spreadsheetId=dataroom_folder_id,
16131
- body=write_body
16132
- ).execute()
16133
- total_cells = response.get('totalUpdatedCells', 0)
16134
- logger.info(f"Успешно записано в Google Sheets: всего обновлено ячеек = {total_cells}.")
16135
- except Exception as e:
16136
- logger.error(f"Ошибка при записи всех таблиц в Google Sheets: {e}")
16041
+ # 4) Переименовываем стандартный лист «Лист1»/«Sheet1» → PROJECT_USERNAME
16042
+ spreadsheet = sheets_service.spreadsheets().get(spreadsheetId=dataroom_folder_id).execute()
16043
+ sheet_id_to_rename = None
16044
+ for sheet in spreadsheet.get('sheets', []):
16045
+ props = sheet.get('properties', {})
16046
+ title = props.get('title', '')
16047
+ if title in ['Лист1', 'Sheet1']:
16048
+ sheet_id_to_rename = props.get('sheetId')
16049
+ break
16050
+
16051
+ if sheet_id_to_rename is not None:
16052
+ rename_request = {
16053
+ 'requests': [
16054
+ {
16055
+ 'updateSheetProperties': {
16056
+ 'properties': {
16057
+ 'sheetId': sheet_id_to_rename,
16058
+ 'title': PROJECT_USERNAME
16059
+ },
16060
+ 'fields': 'title'
16061
+ }
16062
+ }
16063
+ ]
16064
+ }
16065
+ sheets_service.spreadsheets().batchUpdate(
16066
+ spreadsheetId=dataroom_folder_id,
16067
+ body=rename_request
16068
+ ).execute()
16069
+ logger.info(f"Лист переименован в '{PROJECT_USERNAME}'.")
16137
16070
  else:
16138
- logger.warning(f"Файл r1 не найден или не существует: {r1}")
16071
+ logger.warning("Не найден лист 'Лист1' или 'Sheet1' для переименования.")
16072
+
16073
+ # 5) Готовим запросы для записи всех таблиц одна за другой с промежутком
16074
+ safe_title = PROJECT_USERNAME.replace("'", "\\'")
16075
+ offset = 1 # первая строка, с которой начнём писать
16076
+ data_requests = []
16077
+
16078
+ for tbl in tables:
16079
+ # 5.1) Заголовок: имя CSV-файла
16080
+ header_range = f"'{safe_title}'!A{offset}"
16081
+ data_requests.append({
16082
+ 'range': header_range,
16083
+ 'majorDimension': 'ROWS',
16084
+ 'values': [[tbl['name']]]
16085
+ })
16086
+ logger.info(f"Добавлен заголовок '{tbl['name']}' → A{offset}")
16087
+ offset += 1
16088
+
16089
+ # 5.2) Содержимое CSV: все строки сразу под заголовком
16090
+ data_range = f"'{safe_title}'!A{offset}"
16091
+ data_requests.append({
16092
+ 'range': data_range,
16093
+ 'majorDimension': 'ROWS',
16094
+ 'values': tbl['rows']
16095
+ })
16096
+ logger.info(f"Добавлены {len(tbl['rows'])} строк из '{tbl['name']}' → A{offset}")
16097
+ offset += len(tbl['rows'])
16139
16098
 
16099
+ # 5.3) Оставляем минимум 2 пустые строки перед следующей таблицей
16100
+ offset += 2
16140
16101
 
16102
+ # 6) Выполняем единый batchUpdate для всех data_requests
16103
+ write_body = {
16104
+ 'valueInputOption': 'USER_ENTERED',
16105
+ 'data': data_requests
16106
+ }
16107
+ try:
16108
+ response = sheets_service.spreadsheets().values().batchUpdate(
16109
+ spreadsheetId=dataroom_folder_id,
16110
+ body=write_body
16111
+ ).execute()
16112
+ total_cells = response.get('totalUpdatedCells', 0)
16113
+ logger.info(f"Успешно записано в Google Sheets: всего обновлено ячеек = {total_cells}.")
16114
+ except Exception as e:
16115
+ logger.error(f"Ошибка при записи всех таблиц в Google Sheets: {e}")
16141
16116
  except Exception as e:
16142
16117
  logger.info(log_ % str(e))
16143
16118
  await asyncio.sleep(round(random.uniform(0, 1), 2))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: yeref
3
- Version: 0.24.98
3
+ Version: 0.24.99
4
4
  Summary: desc-f
5
5
  Author: john smith
6
6
  Dynamic: author
@@ -0,0 +1,8 @@
1
+ yeref/__init__.py,sha256=Qpv3o6Xa78VdLcsSRmctGtpnYE9btpAkCekgGhgJyXM,49
2
+ yeref/l_.py,sha256=LMX_olmJwq-tgoALJCnhV_fGrL_i_43yBLkLIcEVqGo,1176743
3
+ yeref/tonweb.js,sha256=Jf6aFOQ1OIY4q7fINYz-m5LsI3seMus124M5SYYZmtE,443659
4
+ yeref/yeref.py,sha256=Dj2jndTfiXUJ_fB-hL4tP9ougOcVbUxXdE6HHZ-ikEw,1055246
5
+ yeref-0.24.99.dist-info/METADATA,sha256=DEUgBkgS-tNtezhSF4aD_Rh59oyMn13Mbtql4JbRvvQ,119
6
+ yeref-0.24.99.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
7
+ yeref-0.24.99.dist-info/top_level.txt,sha256=yCQKchWHbfV-3OuQPYRdi2loypD-nmbDJbtt3OuKKkY,6
8
+ yeref-0.24.99.dist-info/RECORD,,
@@ -1,8 +0,0 @@
1
- yeref/__init__.py,sha256=Qpv3o6Xa78VdLcsSRmctGtpnYE9btpAkCekgGhgJyXM,49
2
- yeref/l_.py,sha256=LMX_olmJwq-tgoALJCnhV_fGrL_i_43yBLkLIcEVqGo,1176743
3
- yeref/tonweb.js,sha256=Jf6aFOQ1OIY4q7fINYz-m5LsI3seMus124M5SYYZmtE,443659
4
- yeref/yeref.py,sha256=p6g9zw-LRJx_rpHe7tTAR2BA7Rdsuz5PAtKwlNKf_nI,1057610
5
- yeref-0.24.98.dist-info/METADATA,sha256=EIc6Ur84xwVbYbNOYxbr5B7cwkQTgtLwMLmfOQFQl2s,119
6
- yeref-0.24.98.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
7
- yeref-0.24.98.dist-info/top_level.txt,sha256=yCQKchWHbfV-3OuQPYRdi2loypD-nmbDJbtt3OuKKkY,6
8
- yeref-0.24.98.dist-info/RECORD,,