yeref 0.24.98__py3-none-any.whl → 0.25.1__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,30 +16011,41 @@ 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
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}")
16029
+
16030
+ # 2) Если ни одного CSV не обнаружено, выходим
16031
+ if not tables:
16032
+ logger.warning("Ни один CSV-файл не найден. Прерываем запись.")
16033
+ else:
16034
+ # 3) Авторизация в Google Sheets
16016
16035
  scopes = r_conf('scopes', CONF_P)
16017
16036
  credential_path = os.path.join(EXTRA_D, (r_conf('credential_file', CONF_P))[0])
16018
16037
  credentials = ServiceAccountCredentials.from_json_keyfile_name(credential_path, scopes)
16019
16038
  http_auth = credentials.authorize(httplib2.Http())
16020
16039
  sheets_service = build('sheets', 'v4', http=http_auth, cache_discovery=False)
16021
16040
 
16022
- # 2) Получаем metadata всей таблицы и ищем лист «Лист1»/«Sheet1» для переименования
16041
+ # 4) Переименовываем стандартный лист «Лист1»/«Sheet1» PROJECT_USERNAME
16023
16042
  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
16043
  sheet_id_to_rename = None
16030
- original_title = None
16031
16044
  for sheet in spreadsheet.get('sheets', []):
16032
16045
  props = sheet.get('properties', {})
16033
16046
  title = props.get('title', '')
16034
16047
  if title in ['Лист1', 'Sheet1']:
16035
16048
  sheet_id_to_rename = props.get('sheetId')
16036
- original_title = title
16037
- logger.info(f"Найден лист для переименования: sheetId={sheet_id_to_rename}, title='{title}'")
16038
16049
  break
16039
16050
 
16040
16051
  if sheet_id_to_rename is not None:
@@ -16055,89 +16066,53 @@ async def calc_metrics(bot, PROJECT_USERNAME, dataroom_folder_id, EXTRA_D, BASE_
16055
16066
  spreadsheetId=dataroom_folder_id,
16056
16067
  body=rename_request
16057
16068
  ).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')}'")
16069
+ logger.info(f"Лист переименован в '{PROJECT_USERNAME}'.")
16066
16070
  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}")
16088
-
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}")
16137
- 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.25.1
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=DfuhzfUBIlg5vweCztijcrJWXhSBGkK5ftOlxnMIFHg,1055618
5
+ yeref-0.25.1.dist-info/METADATA,sha256=rjvJMVNCxzK1wec83_EG2KJ5lkgGUMkW-0_zOXslF-g,118
6
+ yeref-0.25.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
7
+ yeref-0.25.1.dist-info/top_level.txt,sha256=yCQKchWHbfV-3OuQPYRdi2loypD-nmbDJbtt3OuKKkY,6
8
+ yeref-0.25.1.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,,