RTFM по созданию ruby gem

Как вы наверно знаете – недавно вышел очередной релиз Ruby on Rails (3.2), в котором сделаны первые шаги в уходе от плагинов, размещаемых в vendor/plugins – в этом релизе они стали deprecated, а в 4й версии фрэймворка от них откажутся окончательно. Наверняка у многих из вас есть свои наработки, которыми бы вы хотели поделиться с коллегами и самое время научиться писать gem-ы, которые могут быть использованы в других проектах. Давайте рассмотрим процесс создания gem-а.

Первым делом создаем “каркас” для нашего будущего gem-а:

alec$ bundle gem super_gem
create  super_gem/Gemfile
create  super_gem/Rakefile
create  super_gem/LICENSE
create  super_gem/README.md
create  super_gem/.gitignore
create  super_gem/super_gem.gemspec
create  super_gem/lib/super_gem.rb
create  super_gem/lib/super_gem/version.rb
Initializating git repo in /Users/alec/Temp/super_gem

где super_gem это название нашего будущего расширения.

Большинство файлов вам наверняка знакомы, поэтому рассмотрим super_gem.gemspec, в котором описываются параметры нашего расширения:

gem.authors       = ["Alexey Poimtsev"] # Имя автора/авторов
gem.email         = ["alec@alec-c4.com"] # Его/их email
gem.description   = %q{TODO: Write a gem description} # краткое и
gem.summary       = %q{TODO: Write a gem summary} # расширенное описание
gem.homepage      = "" # url страницы проекта

# Кусок кода, описывающий какие файлы включаются в проект, название гема и его версия
gem.executables   = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
gem.files         = `git ls-files`.split("\n")
gem.test_files    = `git ls-files -- {test,spec,features}/*`.split("\n")
gem.name          = "super_gem"
gem.require_paths = ["lib"]
gem.version       = SuperGem::VERSION

Версия прописывается в файле lib/super_gem/version.rb (спасибо, кэп :))

Также можно (и даже нужно)  прописать зависимости для разработки и продуктива, например такие

gem.add_development_dependency "rspec"
gem.add_runtime_dependency "rails"

Теперь давайте создадим проект, который будет помогать нам тестировать gem:

$ rails new super_gem_example

и в его Gemfile пропишем путь к нашему расширению:

gem 'super_gem', :path => '../super_gem'

в параметре path мы прописываем путь к проекту гема.

К процессу разработки функционала мы вернемся чуть позже, а сейчас я ненадолго отвлекусь, чтобы рассказать вам, что нам надо делать, когда гем уже будет готов. Первым делом давайте зарегистрируемся на rubygems.org, на котором будут публиковаться наши расширения. Для того, чтобы выполнить сборку достаточно выполнить команду

$ rake build

из директории gem-проекта и в pkg/super_gem-0.0.1.gem появится наш свежесобранные гем. Его мы можем опубликовать с помощью команды

$ gem push pkg/super_gem-0.0.1.gem

а если мы случайно отправили не ту сборку, ее всегда можно удалить с помощью команды gem yank (для этого нам понадобится установить gemcutter). Опубликованный gem появляется на rubygems.org и мы можем даже посмотреть статистику его скачиваний и порадоваться его востребованности (ведь мы же не будем писаться всякий ненужный хлам, правда? :))

А теперь немного сниппетов, которые помогут вам при разработке гема:

1.  Расширение функционала контроллеров

module SuperGem
 module ControllerMethods
    def super_method
      lot_of_code()
    end
 end
end

if defined? ActionController
 ActionController::Base.class_eval do
  include SuperGem::ControllerMethods
 end
end

2. По аналогии – View-хэлперы

module SuperGem
 module ViewMethods
    def super_method
      lot_of_code()
    end
 end
end

if defined? ActionView
 ActionView::Base.class_eval do
  include SuperGem::ViewMethods
 end
end

3. Модели

в lib/super_gem.rb

ActiveRecord::Base.extend(SuperGem::ActiveRecordExtension)

и в файле с методами:

module SuperGem
  module ActiveRecordExtension

    def super_method
      lot_of_code()
    end
  end
end

Вроде несложно :) Если что-то вспомню или у вас будет интересный сниппет – присылайте и я его опубликую :)

Также рекомендую прочитать статью Mountable Engines in Rails 3.1 – она поможет вам разобраться как использовать rails engines в вашем геме.

Sneak (Ябеда) – новый gem для Ruby on Rails

В рамках проекта “ВебНаблюдатель”, над которым мы сейчас работаем я выпустил простой плагин под названием sneak или по русски “ябеда”. Исходные коды разумеется доступны на github. Функционал тривиален и постоянно востребован – необходимо обеспечить пользователям возможность сообщить администрации сайта о том, что какой-то размещенный материал (пост в блоге, комментарий итд) является спамом или вызывает сомнения в своей законности. Расскажу теперь как использовать этот gem.

Для начала прописываем его в Gemfile нашего приложения

gem 'sneak' 

и вызываем bundler

$ bundle install 

запускаем соответствующий генератор

$ rails g sneak:install

и у нас появляются 3 новых файла:

db/migrate/20120122103158_create_sneak.rb
config/initializers/sneak_initializer.rb
app/models/flag_observer.rb

Первый из них – это файл миграции для базы данных. В настоящий момент поддерживается толькр ActiveRecord, в дальнейшем постараюсь добавить поддержку NoSQL. Во втором (sneak_initializer.rb) определены типы сообщений, которые может оставлять пользователь, а flag_observer.rb отвечает за действия, которые необходимо совершить после того, как флаг будет создан.

Далее – мы должны добавить в каждый класс, который будет “ябедничать” :) следующий код

class User < ActiveRecord::Base
 acts_as_sneak
end 

В данном примере я использовал класс User, хотя это может быть Account или какой-нибудь автоматический сборщик спама SpamCollector. Далее – отмечаем все модели, которые могут быть помечены как проблематичные таким образом:

class Project < ActiveRecord::Base
 is_flaggeable
end 

Создаем список типов жалоб в sneak_initializer

CLAIM_TYPES = ["spam1", "offensive", "attention"]

Пишем обработчик:

class FlagObserver < ActiveRecord::Observer
 observe :flag 

 def after_save(flag)
 #TODO add code
 end
end

И теперь мы готовы к тому, чтобы использовать наш плагин. Флаг можно создать так

Project.first.reported :by => User.first, :as => "spam"]

или так

User.first.report :on => Project.first, :with => "spam"]

Если у вас появятся пожелания к дополнительным хэлперам – пишите комментарии здесь или в Github Issues.

12 правил Стива Джобса (by Гай Кавасаки)

Совершенно неожиданно на сайте lifehacker мне попался очень интересный текст, который я решил разместить также и у себя. Это перевод статьи Гая Кавасаки (известный венчурный капиталист в Силиконовой Долине), в которой он сформулирован 12 уроков, полученных в свое время от Стива Джобса.

Read the rest of this entry »

Идеи стартапов

Друзья,
очень много всего произвошло за последнее время и к огромному сожалению у меня не было времени писать в блог. Из наверно самого примечательного – на прошедшем 24-25 сентября марафоне программистов Code 4 Country я занял третье место, а также начал плотно сотрудничать как технический консультант с проектом Алёны Поповой Gov2People, посвященном развитию Gov 2.0 проектов. Сейчас я хочу предложить читателям блога одно, на мой взгляд интересное занятие – я буду публиковать идеи стартапов (что-то свое, а что-то вы мне можете прислать на email (alec at alec-c4 dot com) или в фэйсбуке), а я уже совместно с остальными читателями блога покритикую слабые стороны вашей идеи, чтобы у вас была возможность доработать ее до того уровня, на котором она заинтересует инвестора. Также среди моих друзей и партнеров есть несколько серьезных компаний, которые возможно реализуют вашу идею в реальность.

Итак – для затравки я предлагаю одну идею, которая некоторое время назад пришла в голову мне и еще одному моему коллеге, занимающемуся стартапами, но не в России, а в Силиконовой Долине. Наверняка многие из вас помнят проект Seti@Home, который не так давно прекратил свое существование. Если вы не слышали о нет – то о нем есть замечательная статья в wikipedia. Большинство пользователей использовали простаивающие ресурсы своих компьютеров для того, чтобы проанализировать данные, собираемые радиотелескопом в Аресибо. Идея замечательная, люди действовали на энтузиазме и собранный ими огромный распределенный кластер “пролопатил” огромное количество информации. А теперь собственно сама идея – почему бы не создать сервис, в котором люди, которые нуждаются в вычислительных можностях могли бы арендовать вычислительные мощности компьютеров обычных пользователей? Например – Кэмерон, решает снять продолжение фильма “Аватар” вместо закупки датацентра заказывает распределенное вычисление рендеринга сцен. Или другой вариант – ученые, которым необходимо произвести рассчет того, как будет делиться клетка того или иного вируса. Возможности использования – неограничены.

А как думаете вы – какие у этой идеи сильные и слабые стороны? Как бы вы реализовали такой проект, если бы вы были его автором и стали ли бы им пользоваться?

Linkoholizm #5

Javascript:

pdf.js – скрипт для просмотра pdf средствами html5
require.js – модульная загрузка javascript
head.js – еще один модульный загрузчик javascript
caman,js –  работа с изображениями средствами html5
raphael.js –  библиотека для работы с векторной графикой
jQuery Waypoints - вызов определенной функции при пролистывании страницы
store.js – кроссбраузерное хранение данных
ocanvas,js – еще одна библиотека для рисования с использованием html5 canvas
highcharts.js – рисование графиков
css3-finalize - работа с браузерными префиксами для css3

js-signals и socket.io - push-нотификации с использованиаем node.js на сервере

Linkoholizm #4

Ruby on Rails:

Доступно об использовании redis

savon – WS SOAP клиентская библиотека
backbone-rails - простая интеграция backbone,js в rails приложения
sproutcore-rails - интеграция sproutcore, также есть подходящая статья на русском языке

HTML5 & jQuery

speakker – аудио-плеер
videojs – видео-плеер
face detection jQuery plugin
meerkat – splash screen плагин для jQuery
cloud zoom

 

 

 

Куда пойти “стартапить”?

Многие из нас наверняка задумывались “Как же здорово было бы сделать такой вот классный проект”, но очень часто все начинания заканчивались на стадии идеи, поскольку не хватало тех или иных ресурсов для ее реализации – экспертных знаний, денег или времени. Сейчас при наличии желания, смекалки и некоторой старательности вы можете не только найти инвестора и экспертов для своего проекта, но и сделать его успешным. Разумеется успешность проекта зависит только от вас, а вот найти людей, которые вложат деньги и силы в ваш проект надо найти. Это сделать сложно, но реально и давайте посмотрим где их можно искать.

1. Стартап-фабрики / Бизнес-инкубаторы

- Glavstart - проект Аркадия Морейниса (Москва и регионы)
- Яндекс.Старт (Москва)
- Greenfield Project / Harvest (Москва)
- TexDrive (Москва)
- Farminers - академия проектов от Игоря Мацанюка и Алёны Владимирской (Москва)
- StartFellows (Москва) – Фонд Юрия Мильнера и Павла Дурова
Бизнес-инкубатор ВШЭ (Москва)
Бизнес-инкубатор АНХ (Москва)
Кубок Техноваций МФТИ (Москва)
- Кубок Техноваций МФТИ (Москва)
- Фонд Рамблер-Афиша (Москва)
- New Business Idea (Москва)
- eBuro (Москва)
- Бизнес-инкубатор Ингрия (Питер)
- Startup CrashTest (Киев)

2. Специализированные интернет-сообщества и другие ресурсы для стартаперов

- Wanted.VC
- NaPartner – биржа стартапов
- Co-founder – поиск партнеров для стартапов

- Startup Afisha
- Startup Women
- Microsoft startups portal

Разумеется этот список будет постоянно пополняться, поэтому если у вас есть что-то полезное и/или интересное – присылайте и я его дополню.

 

 

 

Тестирование Rails-приложений от А до Я. #1 – подготовка и тестирование routes

Продолжаем тему тестирования rails-приложений, начатую ранее. Сегодня мы создадим тестовое приложение, которое будем покрывать тестами. Пускай это будет простой менеджер проектов, который для аутентификации будет использовать devise, для авторизации cancan, а также для оптимизации кода мы будем использовать inherited_resources. В качестве тестового фрэймворка будет использоваться rspec.
Read the rest of this entry »

Тестирование Rails-приложений от А до Я. #0 – инструментарий

Сегодняшней статьей я хочу открыть серию статей, посвященных тестированию в Ruby on Rails.  Все статьи рассчитаны на начинающих, поэтому прошу не особенно придираться к тому, что я буду стараться объяснить кому-то уже известные вещи доступным (я надеюсь :)) языком.

Для начала давайте посмотрим на то, что мы можем использовать для написания тестов. Список на самом деле далеко не полный, поэтому я буду стараться постоянно его обновлять, а если у вас есть какие-либо предпочтения/дополнения – отписывайтесь в комментариях. Итак …

RSpec – приятный тестовый фрэймворк, выступающий как альтернатива стандарному TestUnit. Я пожалуй склонен согласиться с мнение, что главным отличием у них является семантика и лично для меня семантика RSpec кажется более приятной.

Cucumber – инструмент, позволяющий использовать методологию Behavior Driven Development (BDD), при использовании которой вначале пишутся пользовательские сценарии, а потом на основе их разрабатывается код системы.

rr – mocking-фрэймворк с очень приятным синтаксисом. Кстати – а какой перевод термина mock вам кажется наиболее правильным?

ZenTest & autotest понадобятся нам для того, чтобы в режиме реального времени отслеживать как повлияли изменения кода приложения на результаты тестирования (об этом в следующей статье)

factory_girl_rails – версия под rails >= 3.0 плагина, позволяющего заменить стандартные fixtures на более гибкие фабрики данных. К неплохим аналогам можно отнести machinist.

С помощью shoulda можно сделать гораздо более читаемым код тестовых сценариев.

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

rcov позволяет определить степень покрытия кода тестами

metric_fu – еще одна утилита, позволяющая измерить качаство покрытия кода тестами. Очень хорошо была описана в соответствующих Railscast и Asciicast

С помощью email_spec можно покрыть spec-тестами отправляемые email-ы.

capybara поможет вам провести интеграционное тестирование web-приложения

timecop позволяет “манипулировать” временем при тестировании.

В следующей статье мы попробуем написать наш первый тестовый сценарий с использованием Rspec.

Сервис-доноры

Сегодня я хотел бы подготовить каталог онлайн-сервисов, которые предоставляют возможность разработчикам используя публичный api разрабатывать свои проекты, не особо углубляясь в нюансы работы биллинга или обработки звонков. Данный список я буду постоянно обновлять,  если у вас есть сложившееся мнение о том или ином ресурсе или вы хотите что-то добавить – оставляйте свои комментарии.

Read the rest of this entry »

←Older