Code Monkey home page Code Monkey logo

gb_go_best_final's Introduction

Курсовой проект по курсу "Лучшие практики Go"

Задание

Необходимо написать консольную программу, которая по заданному клиентом запросу осуществляет поиск данных в CSV-файлах, своего рода простенький исполнитель SQL запросов. При запуске программа должна предлагать пользователю ввести через командную строку поисковой запрос, сформированный в виде набора условий column_name OP value [AND/OR column_name OP value] … Например, age > 40 AND status = “sick” Критерии приемки:

  • При запуске программа печатает путь до исполняемого файла и версию последнего коммита
  • Программа должна корректно обрабатывать выход по сигналу SIGINT, прерывая поиск, если он запущен
  • Программа должна получать настройки из текстового конфигурационного файла (например, в TOML формате) при старте
  • Программа должна завершать исполнение запроса, если он занимает слишком продолжительное время (значение таймаута задается в конфигурационном файле)
  • Программа должна логировать все запросы в файл access.log, логировать все ошибки (например, остановку пользователем или прерывания по таймауту, невалидные запросы пользователя) в error.log
  • Код должен быть покрыт тестами (test coverage хотя бы 30%)
  • Код должен быть организован согласно выбранным принципам, например можно использовать project-layout для вдохновения
  • Должен быть создан конфигурационный файл для golangci-lint
  • При коммите в локальный репозиторий в автоматическом режиме должно происходить следующее:
    • make test - должен запускать тесты и печатать отчет о coverage
    • make check - должен запускать все линтеры

Реализовано

  • Прогграмма обрабатывает запрос, с возможностью выбора полей для вывода (выводит в "raw" формате)
  • Программа обрабатывает сигнал и завершает все через контекст
  • Программа считывает настройки из файла config.yaml по умолчанию или по адресу, указанному при запуске во флаге config
  • Программа завершает запрос, если время превышает таймаут, указанный в конфиге
  • программа логирует данные в файл, указанный в конфиге в logfile: , если там не указан путь до файла, то программа выводит логи в stderr
  • Код покрыт тестами они могут быть запущены при помощи команды make test
  • Код "пытался быть организованным" согласно принципам Hexagonal Architecture
  • Конфигурационный файл golangci-lint создан
  • При помощи Github Actions при коммите запускаются проверки линтерами и тесты

Инструкции для запуска

Можно запустить используя make run, тогда будет напечатан хеш последнего коммита, выбран стандартный файл конфигурации.

Программа предложит ввести запрос к таблице: По умолчанию в репозитории выбрана таблица small.csv с небольшим количеством записей

Стандартный запрос может выглядеть так:

SELECT * FROM table -- имя таблицы - любое, потому что фактическая таблица берется из конфига
    WHERE club = sevilla or not pts < 33

Ограничения:

  • пока не работает запрос без условия
  • не нужно ставить ; в конце
  • нет выбора таблице в запросе (только через конфиг)
  • работают только операции сравнение <, >, <=, >=, = и логические операции OR, NOT, AND
  • Запросы можно вводить в любом регистре, но вся обработка происходит в нижнем, поэтому при запросе не дифференцируются значения с разным регистром

Проблемы

Не реализовано, но будет в ближайшее время

  • Вывод таблицы нужно сделать в виде ... таблицы
  • Не сделана обработка пустого запроса вида
SELECT * FROM table

если повезет исправить до проверки, то исправлю, но готов к снижению даже в случае исправления

  • Проверка только однословного значения

  • Самая большая проблема - высокая связность модулей, старался решить эту проблему за счет интерфесов, но, как мне кажется не очень удачно.

  • Остутсвие возможности легкого расширени из-за проблемы из предыдущего пункта

UPD:

  • Добавлена обработка запроса без условия
  • Добавлен консольный вывод

gb_go_best_final's People

Contributors

xfiendx4life avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.