yeref 0.24.97__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,100 +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 всей таблицы, чтобы увидеть, какие листы есть сейчас
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
- # 3) Ищем лист с названием «Лист1» или «Sheet1»
16030
- sheet_id_to_rename = None
16031
- original_title = None
16032
- for sheet in spreadsheet.get('sheets', []):
16033
- props = sheet.get('properties', {})
16034
- title = props.get('title', '')
16035
- if title in ['Лист1', 'Sheet1']:
16036
- sheet_id_to_rename = props.get('sheetId')
16037
- original_title = title
16038
- logger.info(f"Найден лист для переименования: sheetId={sheet_id_to_rename}, title='{title}'")
16039
- 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}")
16040
16029
 
16041
- # 4) Если нашли, то переименовываем в PROJECT_USERNAME
16042
- if sheet_id_to_rename is not None:
16043
- rename_request = {
16044
- 'requests': [
16045
- {
16046
- 'updateSheetProperties': {
16047
- 'properties': {
16048
- 'sheetId': sheet_id_to_rename,
16049
- 'title': PROJECT_USERNAME
16050
- },
16051
- 'fields': 'title'
16052
- }
16053
- }
16054
- ]
16055
- }
16056
- sheets_service.spreadsheets().batchUpdate(
16057
- spreadsheetId=dataroom_folder_id,
16058
- body=rename_request
16059
- ).execute()
16060
- logger.info(f"Запрос на переименование отправлен: '{original_title}' → '{PROJECT_USERNAME}'")
16061
-
16062
- # 5) Подтягиваем снова metadata, чтобы убедиться, что название поменялось
16063
- spreadsheet_after = sheets_service.spreadsheets().get(spreadsheetId=dataroom_folder_id).execute()
16064
- logger.info("После переименования. Список листов теперь:")
16065
- for sheet in spreadsheet_after.get('sheets', []):
16066
- props = sheet.get('properties', {})
16067
- logger.info(f" • sheetId={props.get('sheetId')} title='{props.get('title')}'")
16068
- else:
16069
- logger.warning("Не найден лист с названием 'Лист1' или 'Sheet1' — пропускаем переименование.")
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)
16070
16040
 
16071
- # 6) Читаем CSV-файл (r1) целиком
16072
- with open(r1, newline='', encoding='utf-8') as csvfile:
16073
- reader = csv.reader(csvfile)
16074
- all_rows = list(reader)
16075
- logger.info(f"Прочитано {len(all_rows)} строк из файла {r1}.")
16076
-
16077
- # 7) Составляем диапазон для записи: используем PROJECT_USERNAME
16078
- # Если название листа может содержать пробелы или спецсимволы, оборачиваем в одинарные кавычки:
16079
- safe_title = PROJECT_USERNAME.replace("'", "\\'")
16080
- range_str = f"'{safe_title}'!A1"
16081
- logger.info(f"Будем записывать в диапазон: {range_str}")
16082
-
16083
- # 8) Формируем тело запроса на запись
16084
- write_body = {
16085
- 'valueInputOption': 'USER_ENTERED',
16086
- 'data': [
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': [
16087
16054
  {
16088
- 'range': range_str,
16089
- 'majorDimension': 'ROWS',
16090
- 'values': all_rows
16055
+ 'updateSheetProperties': {
16056
+ 'properties': {
16057
+ 'sheetId': sheet_id_to_rename,
16058
+ 'title': PROJECT_USERNAME
16059
+ },
16060
+ 'fields': 'title'
16061
+ }
16091
16062
  }
16092
16063
  ]
16093
16064
  }
16094
-
16095
- # 9) Делаем batchUpdate, чтобы записать всё из all_rows
16096
- try:
16097
- response = sheets_service.spreadsheets().values().batchUpdate(
16098
- spreadsheetId=dataroom_folder_id,
16099
- body=write_body
16100
- ).execute()
16101
- updated_cells = response.get('totalUpdatedCells', 0)
16102
- logger.info(f"Успешно записано в Google Sheets: обновлено ячеек = {updated_cells}.")
16103
- except Exception as e:
16104
- logger.error(f"Ошибка при записи в Google Sheets: {e}")
16065
+ sheets_service.spreadsheets().batchUpdate(
16066
+ spreadsheetId=dataroom_folder_id,
16067
+ body=rename_request
16068
+ ).execute()
16069
+ logger.info(f"Лист переименован в '{PROJECT_USERNAME}'.")
16105
16070
  else:
16106
- logger.warning(f"Файл с метриками не найден или не существует: {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'])
16098
+
16099
+ # 5.3) Оставляем минимум 2 пустые строки перед следующей таблицей
16100
+ offset += 2
16107
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}")
16108
16116
  except Exception as e:
16109
16117
  logger.info(log_ % str(e))
16110
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.97
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=jdG1SO9WRV8e0o8HjviTOMG-m4rxya1lcClakmVDVZc,1055625
5
- yeref-0.24.97.dist-info/METADATA,sha256=MNCnHGJUW1SZaDvGSRhQClVxHOkxpX0KrrOI50o-aDM,119
6
- yeref-0.24.97.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
7
- yeref-0.24.97.dist-info/top_level.txt,sha256=yCQKchWHbfV-3OuQPYRdi2loypD-nmbDJbtt3OuKKkY,6
8
- yeref-0.24.97.dist-info/RECORD,,