Skip to content

curkan/go-tickets

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GoTickets

GoTickets - это простой и эффективный менеджер тикетов с интерактивным терминальным интерфейсом, написанный на Go.

Описание

GoTickets позволяет:

  • Создавать и управлять тикетами с названием и ссылкой прямо из терминала
  • Искать тикеты по названию и URL
  • Удалять тикеты с подтверждением
  • Открывать тикеты в браузере по ссылке
  • Сохранять данные локально в формате JSON
  • Работать с красивым интерактивным интерфейсом

Приложение использует библиотеку Bubble Tea для создания современного TUI интерфейса и Lipgloss для стилизации.

Установка

Из HomeBrew (рекомендовано)

# Добавить tap
brew tap curkan/homebrew-public

# Установить gotickets
brew install gotickets

Из исходного кода

# Клонируйте репозиторий
git clone <url-репозитория>
cd gotickets

# Установите зависимости
go mod tidy

# Соберите приложение
go build -o gotickets ./cmd/gotickets

# Или запустите напрямую
go run ./cmd/gotickets

Требования

  • Go 1.21 или выше
  • Терминал с поддержкой ANSI цветов

Использование

Запуск приложения

# Если собрали бинарник
./gotickets

# Или запуск из исходников
go run .

Управление

Приложение имеет семь основных режимов:

Режим просмотра списка (основной)

Навигация по тикетам:

  • ↑/k - переместить курсор вверх
  • ↓/j - переместить курсор вниз

Навигация по списку:

  • PgUp/Ctrl+B - страница вверх
  • PgDn/Ctrl+F - страница вниз
  • Home/Ctrl+A - к началу списка
  • End/Ctrl+E - к концу списка

Управление тикетами:

  • a - добавить новый тикет
  • / - поиск тикетов
  • r - сбросить фильтры и показать все тикеты
  • d - удалить выбранный тикет (с подтверждением)
  • o - открыть ссылку выбранного тикета в браузере
  • i - импорт тикетов из текстового файла
  • b - управление резервными копиями
  • q или Ctrl+C - выход из приложения

Режим добавления тикета

Добавление тикета происходит в два этапа:

Шаг 1 - Ввод ссылки:

  • Введите URL/ссылку для тикета
  • Enter - продолжить к вводу названия
  • Esc - отменить и вернуться к списку
  • Backspace - удалить последний символ

Шаг 2 - Ввод названия:

  • Введите название тикета
  • Enter - сохранить тикет
  • Esc - отменить и вернуться к списку
  • Backspace - удалить последний символ

Режим поиска

  • Введите поисковый запрос (поиск происходит в реальном времени)
  • Поиск ищет совпадения в названии и URL тикетов
  • Enter - применить фильтр и вернуться к списку
  • Esc - отменить поиск и вернуться к полному списку
  • Backspace - удалить последний символ

Режим подтверждения удаления

  • Отображается информация о тикете для удаления
  • y или Enter - подтвердить удаление
  • n или Esc - отменить удаление

Режим импорта тикетов

  • Введите полный путь к .txt файлу
  • Enter - начать импорт
  • Esc - отменить импорт

Режим управления резервными копиями

  • Отображается список доступных резервных копий
  • Enter - выбрать резервную копию для восстановления
  • Esc - вернуться к списку тикетов

Режим подтверждения восстановления

  • Отображается информация о выбранной резервной копии
  • y или Enter - подтвердить восстановление
  • n или Esc - отменить восстановление

Формат файла для импорта

Каждая строка в файле должна содержать:

URL - Название тикета

Примеры правильного формата:

https://tracker.egamings.com/issues/424846 - [Fundist] большой отступ от Iframe angular снизу
https://github.com/user/repo/issues/123 - Исправить баг с авторизацией
https://example.com/task/456 - Добавить новую функцию

Особенности импорта:

  • Дубликаты определяются по URL - если тикет с такой ссылкой уже существует, он не будет добавлен повторно
  • Строки с неверным форматом (без " - " разделителя) будут пропущены и отмечены как ошибки
  • Пустые строки игнорируются
  • После импорта отображается детальная статистика:
    • Количество добавленных тикетов
    • Количество пропущенных дубликатов
    • Количество ошибок формата
    • Список конкретных ошибок

Навигация по списку

Приложение использует встроенный компонент списка Bubble Tea для удобной навигации:

  • Навигация: используйте стрелки /, j/k, PgUp/PgDn, Home/End для перемещения по списку
  • Автоскролл: список автоматически прокручивается при навигации
  • Встроенная фильтрация: компонент списка поддерживает встроенные возможности фильтрации
  • Производительность: эффективная обработка больших списков тикетов

Хранение данных

Все тикеты сохраняются в файле ~/.gotickets/tickets.json. Приложение автоматически:

  • Создает директорию при первом запуске
  • Сохраняет изменения после добавления тикетов
  • Загружает данные при запуске

Система резервных копий

Приложение автоматически создает резервные копии перед критическими операциями:

  • Добавление тикета - создается бекап перед добавлением
  • Удаление тикета - создается бекап перед удалением
  • Импорт тикетов - создается бекап перед импортом

Особенности системы бекапов:

  • Бекапы сохраняются в формате tickets_backup_YYYY-MM-DD_HH-MM-SS.json
  • Бекапы содержат полную копию данных на момент создания
  • Восстановление из бекапа заменяет все текущие тикеты
  • Бекапы можно просматривать и восстанавливать через интерфейс приложения (клавиша b)

Безопасность:

  • Тесты не влияют на реальные данные пользователя
  • Все тесты используют изолированные временные директории
  • Система бекапов защищает от случайной потери данных

Структура проекта

gotickets/
├── cmd/
│   └── gotickets/
│       └── main.go           # Точка входа в приложение
├── pkg/
│   └── gotickets/            # Публичный API пакет
│       ├── ticket.go         # Обертки для работы с тикетами
│       └── ui.go            # UI обертки и модель
├── internal/                 # Внутренние пакеты
│   ├── storage/              # Пакет для работы с данными
│   │   └── storage.go        # Модели данных и файловые операции
│   └── ui/                   # Пакет пользовательского интерфейса
│       ├── model.go          # Основная модель UI
│       ├── list.go           # Управление списком тикетов
│       ├── input.go          # Компоненты ввода
│       ├── handlers.go       # Обработчики событий
│       ├── search.go         # Функциональность поиска
│       ├── confirm.go        # Диалоги подтверждения
│       ├── import.go         # Импорт тикетов
│       ├── backup.go         # Управление резервными копиями
│       ├── browser.go        # Интеграция с браузером
│       └── view.go           # Рендеринг представлений
├── test/                     # Тестовые пакеты
│   ├── mocks/                # Моки для тестирования
│   │   └── filesystem.go     # Mock файловой системы
│   ├── unit/                 # Unit тесты
│   │   ├── storage_test.go   # Тесты storage пакета
│   │   └── ui_test.go        # Тесты UI пакета
│   └── integration/          # Интеграционные тесты
│       └── ticket_types_test.go # Тесты типов данных
├── go.mod                   # Зависимости Go
├── go.sum                   # Контрольные суммы зависимостей
└── README.md                # Документация

Разработка

Запуск тестов

# Запустить все тесты
go test ./test/...

# Запустить только unit тесты
go test ./test/unit/ -v

# Запустить только интеграционные тесты
go test ./test/integration/ -v

# Запустить тесты несколько раз для проверки стабильности
go test ./test/... -v -count=3

Изоляция тестов

Все тесты полностью изолированы от реальной среды выполнения:

  • MockFileSystem: Создается мок файловой системы, который эмулирует все операции с файлами
  • Временные директории: Каждый тест использует t.TempDir() для создания изолированной временной директории
  • Подмена глобальной переменной: Глобальная переменная fileSystem заменяется на мок для каждого теста
  • Автоматическая очистка: Все временные файлы и директории автоматически удаляются после завершения тестов
  • Безопасность: Тесты никогда не взаимодействуют с реальными данными пользователя

Архитектура изоляции:

  • FileSystem interface: Определяет интерфейс для операций с файлами
  • RealFileSystem: Реальная реализация для production
  • MockFileSystem: Мок-реализация для тестов с полным контролем над файловыми операциями
  • Глобальная переменная fileSystem: Позволяет подменять реализацию в тестах

Особенности изоляции:

  • Тесты могут выполняться параллельно без конфликтов
  • Каждый тест получает чистую среду выполнения
  • Файлы создаются только во временных директориях через мок
  • Реальные данные пользователя полностью защищены
  • Мок позволяет контролировать ошибки файловых операций для тестирования edge cases

Сборка релиза

# Сборка для текущей платформы
go build -o gotickets ./cmd/gotickets

# Кросс-компиляция для разных платформ
GOOS=linux GOARCH=amd64 go build -o gotickets-linux-amd64 ./cmd/gotickets
GOOS=windows GOARCH=amd64 go build -o gotickets-windows-amd64.exe ./cmd/gotickets
GOOS=darwin GOARCH=amd64 go build -o gotickets-darwin-amd64 ./cmd/gotickets

Архитектура

Приложение построено на модульной архитектуре с разделением обязанностей:

Пакеты

  • cmd/gotickets: Точка входа в приложение (main пакет)
  • pkg/gotickets: Публичный API пакет с обертками для внешнего использования
  • internal/storage: Управление данными и файловыми операциями
    • Ticket - структура отдельного тикета (ID, название, URL, время создания)
    • TicketStorage - хранилище тикетов с методами CRUD и поиска
    • FileSystem - интерфейс для абстракции файловых операций
  • internal/ui: Пользовательский интерфейс
    • Model - состояние приложения для Bubble Tea
    • ViewMode - перечисление режимов интерфейса
    • Модульная система обработчиков для разных режимов
  • test/: Организованная структура тестов
    • mocks/ - Моки для тестирования
    • unit/ - Unit тесты
    • integration/ - Интеграционные тесты

Принципы архитектуры

  • Разделение обязанностей: Каждый модуль отвечает за свою область
  • Dependency Injection: Использование интерфейсов для тестируемости
  • Модульность: UI разбит на логические компоненты
  • Инкапсуляция: Приватные методы и состояние в internal пакетах
  • Обратная совместимость: Публичные обертки для существующего API

Новые возможности в версии 2.0

  • Поддержка URL: Теперь каждый тикет содержит ссылку
  • Двухэтапное создание: Сначала вводится URL, затем название
  • Удаление с подтверждением: Безопасное удаление тикетов
  • Открытие в браузере: Клавиша 'o' открывает ссылку тикета
  • Расширенный поиск: Поиск по названию и URL

Новые возможности в версии 2.1

  • Импорт тикетов: Массовый импорт из .txt файлов
  • Обнаружение дубликатов: Автоматическая проверка по URL
  • Детальная статистика: Полный отчет о результатах импорта
  • Обработка ошибок: Информативные сообщения об ошибках формата

Новые возможности в версии 2.2

  • Компонент списка Bubble Tea: Использование встроенного list компонента для лучшей производительности
  • Встроенная навигация: Навигация по списку с помощью стрелок, j/k, Page Up/Page Down
  • Встроенная фильтрация: Поддержка встроенного поиска/фильтрации списка
  • Улучшенный UI: Более стабильный и отзывчивый интерфейс

Новые возможности в версии 2.3

  • Система резервных копий: Автоматическое создание бекапов перед критическими операциями
  • Управление бекапами: Просмотр и восстановление из резервных копий через интерфейс
  • Автоматические бекапы: Создание бекапов перед добавлением, удалением и импортом тикетов
  • Безопасное восстановление: Подтверждение перед восстановлением из бекапа
  • Формат бекапов: Сохранение в формате tickets_backup_YYYY-MM-DD_HH-MM-SS.json
  • Полная изоляция тестов: Все тесты работают в изолированной среде без влияния на реальные данные

Новые возможности в версии 3.0 (рефакторинг)

  • Модульная архитектура: Код разделен на логические модули в internal пакетах
  • Улучшенная тестируемость: Полное внедрение зависимостей и интерфейсов
  • Разделение обязанностей: UI и storage логика четко разделены
  • Чистый код: Следование лучшим практикам Go
  • Инкапсуляция: Приватные методы и поля защищены от внешнего доступа
  • Обратная совместимость: Все публичные API остались неизменными
  • Модульные тесты: Упрощенные и более надежные тесты
  • Организованная структура тестов: Разделение на unit, integration и mocks
  • Улучшенная архитектура: Single Responsibility Principle и SOLID принципы
  • Стандартная структура Go проекта: cmd/, pkg/, internal/, test/

Технические улучшения

  • Внедрение зависимостей: FileSystem интерфейс для моков в тестах
  • Модульные handlers: Каждый режим UI имеет отдельный обработчик
  • Компонентизация UI: Разделение на логические компоненты (list, input, view)
  • Чистые интерфейсы: Минимальные публичные API
  • Улучшенная архитектура пакетов: internal/ структура для инкапсуляции

Лицензия

MIT License

About

GoTickets - это простой и эффективный менеджер тикетов с интерактивным терминальным интерфейсом, написанный на Go.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors