Использование транзакций при тестировании Sinatra приложения

22 Aug

В прошлый раз я писал о том, что ActiveRecord::Base.establish_connection на самом деле не устанавливает соединения с базой данных. В этот раз я хочу написать о том, как тестировать модели ActiveRecord не в Rails окружении, точнее даже не об этом. Думаю, многие знают о том, что тесты в Rails можно оборачивать в транзакции, т.е. после выполнения теста состояние базы данных не меняется. Я считаю, что это правильный подход, и поэтому решил использовать его и своем текущем приложении.

В первую же очередь подумалось о том, раз это есть в Rails, значит надо его оттуда вытащить. На практике, как обычно это получается, все оказалось не так просто. Надо отметить, что сначала все было хорошо. Все, что мне было нужно, было сосредоточено в  active_record/test_case, который тянул за собой файлы из active_support. Так как и то, и другое и так уже было в моем приложении, все представлялось в радужном свете. Не тут-то было, наиболее важная часть, именна та, которая касается transactional fixtures, почему-то находилась в action_controller/integration. Тянуть к себе action_controller мне не хотелось. Изучив немного код, я понял, что на самом деле достаточно просто. Каждую транзакцию следует начать этим кодом:

        ActiveRecord::Base.connection.increment_open_transactions
        ActiveRecord::Base.connection.transaction_joinable = false
        ActiveRecord::Base.connection.begin_db_transaction

И закончить этим:

        ActiveRecord::Base.connection.rollback_db_transaction
        ActiveRecord::Base.connection.decrement_open_transactions

(код выдран из файла active_record/fixtures)

Вполне достаточно решение, но, как известно большинство велосипедов уже изобретено. В группе обсуждения Sinatra мне подсказали замечательную библиотеку database_cleaner, в первом приближении это именно то, что нужно. Тем более, что автор заявляет:

One of my motivations for writing this library was to have an easy way to turn on what Rails calls “transactional_fixtures” in my non-rails ActiveRecord projects.

Всю необходимую информацию об использовании библиотеки можно прочитать в readme.

ActiveRecord::Base.establish_connection

18 Aug

Сегодня в ходе работы над одним приложением столкнулся с интересным фактом, знание которого может сэкономить немного времени. Ситуация была следующая: есть приложение, реализованное с использованием Sinatra, для связи с базой данных используется ActiveRecord. Тестирование наше все, поэтому я решил написать тест для своей модели (User). В файле test_helper.rb вызовом:

ActiveRecord::Base.establish_connection(db_config)

я, как я думал, устанавливал соединение с файлом БД (sqlite3). Каково же было мое удивление, когда первый же запуск теста выдал следующую ошибку:

SQLite3::CantOpenException: unable to open database file

В ходе поиска причины проблемы выяснилось, что ActiveRecord::Base.establish_connection не устанавливает соединения, а всего лишь сохраняет внутри себя информацию о том, как это соединение можно установить. Рельно же соединение устанавливается при первом вызове метода класса, наследуемого от ActiveRecord::Base. Так как такой вызов происходил из файла с тестом и путь к базе в файле конфигурации был указан относительный, SQLite3 не могла найти файл. Для себя я эту проблему решил преобразованием относительно пути в абсолютный в файле test_helper.rb

db_config = File.expand_path("../" + db_config['database'])

Google Wave – не получилось

5 Aug

Утро принесло плохую новость – Google не будет больше разрабатывать свой сервис Google Wave, причем не просто не будет разрабатывать, но вообще закроет его ближе к концу года.

Основной причиной столь радикального решения называется малое количество пользователей.

…Wave has not seen the user adoption we would have liked.

Действительно, еще в самом начале пути, когда Google Wave только появился, многие задавали себе вопрос – что это такое и с чем его едят? Для многих знакомство с сервисом закончилось на этом вопросе. Этот же вопрос задавал себя и я, особенно в первое время, когда еще никто из моих знакомых не начал пользоваться Wave. Со временем мне удалось заманить часть своих друзей и коллег путем активной раздачи инвайтов. Однако активно пользоваться им начали наверное процентов 20. И это люди каждый день работающие в software development. Что уж говорить о людях не технических. Единственный человек, которого мне удалось завлечь в Google Wave, была моя жена, но у нее просто не было выбора. Даже сейчас, спустя почти полтора года после запуска, читая комментарии к статьям о закрытии Google Wave, самым распространенным является мнение, которое можно описать следующим образом – пробовал, ничего не понял, не пользовался.

Жизнь Google Wave является подтверждением в общем-то банальной мысли, встречающейся в каждой статье и книге, посвященной разработке коммерческого ПО – сама идея, насколько хорошей и технологичной она не была, стоит достаточно мало. Важно, чтобы люди пользовались продуктом, основанным на этой идее, иначе грош ей цена. Как оказалось, Wave получился не очень хорошим продуктом, но я не считаю, что его появление было напрасным. Некоторые идеи, реализованные в этом сервисе, безусловно заслуживают внимания, к тому же, часть исходных текстов, а также описание протокола открыты сообществу разработчиков, а значит можно ожидать развития этих идей, появления новых, основанных на них сервисов.

Для меня Google Wave был отличным инструментом для коллективного обсуждения, теперь придется искать что-то новое. Жаль, очень жаль.

WordPress 3.0

18 Jun

WordPress обновился до версии 3.0. Решил проверить у себя, сможет ли он обновиться автоматически, через веб-интерфейс. Смог! Все прошло без проблем, теперь мог небольшой сайт бежит на WordPress версии 3.0.

P.S. Перед обновлением лучше почитать инструкцию, ну или хотя бы сделать бэкап данных.

diaspora* – первый звоночек Facebook

14 May

В прошлом посте я писал о том, что появление социальных сетей, основанных на открытых стандартах, должно дать новый толчок их развитию. Буквально на следующий же день я наткнулся на статью в NY Times – “Four Nerds and a Cry to Arms Against Facebook“. В этой статье рассказывается о проекте diaspora* – попытке четырех студентов создать открытый аналог Facebook.

Вот какое определение дают основатели проекта: diaspora - the privacy aware, personally controlled, do-it-all distributed open source social network. У них в целях к сентябрю этого года выдать первую версию, которая будет реализовывать следующий функционал:

  • Full-fledged communications between Seeds (Diaspora instances)
  • Complete PGP encryption
  • External Service Scraping of most major services (reclaim your data)
  • Version 1 of Diaspora’s API with documentation
  • Public GitHub repository of all Diaspora code

Думаю, обязательно стоит следить за этим проектом, и не только следить, но и помогать.

Diaspora: Personally Controlled, Do-It-All, Distributed Open-Source Social Network from daniel grippi on Vimeo.