rake gems:install

3 мая 2009, Воскресенье

В версию rails 2 была добавлена интересная возможность установки зависимых gem библиотек используя только 1 команду. Для этого Вам необходимо вписать в environment.rb следующие строки, например для установки will_paginate:

    config.gem 'mislav-will_paginate', :version => '~> 2.3.8',
      :lib => 'will_paginate',
      :source => 'http://gems.github.com'

После этого в командной строке нужно набрать rake gems:install. Но не все так просто.

Если у Вас есть rake task в котором Вы, например включаете  environment.rb то Вы получите интересное сообщение, примерно такое:

sudo rake gems:install
(in /home/cthulhu/development/blog)
Missing these required gems:
  mislav-will_paginate  ~> 2.3.8

You're running:
  ruby 1.8.6.111 at /usr/bin/ruby1.8
  rubygems 1.3.2 at /home/cthulhu/.gem/ruby/1.8, /usr/lib/ruby/gems/1.8

Run `rake gems:install` to install the missing gems.

ИМХО это еще хуже чем драйвера для вашего CD на CD.

Существует пара хаков против такого поведения.

Плохой, ИМХО, - подхачить rail. Для этого в файле rails/lib/gems.rake в блоке:

namespace :gems do
  task :base do
    $gems_rake_task = true
    require 'rubygems'
    require 'rubygems/gem_runner'
    begin
      Rake::Task[:environment].invoke
    rescue
    end
  end
  ...
end

Нужно заменить:

 Rake::Task[:environment].invoke

на

begin
  Rake::Task[:environment].invoke
 rescue
end

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

Второй вариант, более преемлемый - дописать в  environment.rb небольшой хак вида:

if $rails_gem_installer
  class Rails::Initializer
    def load_application_initializers; end
  end
  config.gem 'mislav-will_paginate',
    :version => '~> 2.3.8', :lib => 'will_paginate',
    :source => 'http://gems.github.com'
end

Переменная $rails_gem_installer будет установлена когда Вы будете вызывать рейк таски из семейства установки гемов.

Так вот.

Может кто знает более правильные способы решения этой проблемы?

Rails + Populator + Faker

29 ноября 2008, Суббота

Часто в процессе разработки сайта на Rails нужно быстро создать много данных, например для тестирования пажинатора.

Можно написать rake задачу, можно добавлять вручную. В любом случае тяжело гарантировать приближенность к реальности вводимых данных. Например, выдумывать 1000 электронных адресов, фамилий и т.д. это не шутка.

Чтобы сэкономить время рекомендую воспользоваться библиотекой populator.

Ставим:

  gem install populator 

Используем. Например, нам нужно добавить в базу 3000 записей о пользователях

  User.populate(3000) do |user|
    user.first_name = “Tony”
    user.last_name = “Stark”
  end

В целом неплохо. Но как, то не очень хорошо, что у нас в базе 3000 железных людей. Нам бы разнообразия.

Для этого есть еще одна чудная библиотечка faker. Ставим:

  gem install faker 

Теперь перепишем наш пример, добавив пару дополнительных полей и оформив в rake задачу, чтобы удобно было запускать, например в production:

  require ‘populator’
  require ‘faker’

  require ‘rake’
  require ‘rake/testtask’
  require ‘rake/rdoctask’

  require ‘rubygems’
  require(File.join(File.dirname(__FILE__), ‘../../config/environment.rb’))

  namespace :populate do
     desc “Add test data”
     task(:users) do
       User.populate(3000) do |user|
         user.first_name = Faker::Name.first_name # генерирует Имя
         user.last_name = Faker::Name.last_name   # Фамилию
         user.email = Faker::Internet.email       # мыло
         user.login = Faker::Internet.user_name   # логин
         user.phone = Faker::PhoneNumber.phone_number # номер телефона
         user.about = Faker::Lorem.paragraphs( 5 ) # О себе – 5 параграфов
       end
    end
  end

Теперь у нас в базе в любой конфигурации может быть 3000 пользователей с совершенно разными данными. Очень удобно. Сокращает время, и появляются дополнительные возможности тестирования.

composite primary keys

2 октября 2008, Четверг

Дело в том, что Ruby on Rails не поддерживает составные первичные ключи. Но эту проблему можно решить с помощью гемки composite_primary_keys.

И ставим gem:

  gem install composite_primary_keys

Модель с составным первичным ключем будет выглядеть следующим образом:

  require 'composite_primary_keys'

  class Probability < ActiveRecord::Base
    set_primary_keys :row, :col
  end

И напоследок несколько примеров использования:

  Probability.primary_key # => [:row, :col]
  Probability.primary_key.to_s # => "row,col"
  Probability.find(1,1) # => <Probability row: 1, col: 1, val: 17>
  Probability.find [1,1],[1,2] # => [<Probability row: 1, col: 1, val: 17>, <Probability row: 1, col: 2, val: 19>]
  Probability.find(:first).to_param # => "1,1"

Импорт контактов из популярных почтовых сервисов

19 мая 2008, Понедельник

Часто возникает необходимость автоматического импорта контактов из таких популярных сервисов как Gmail, AOL, Hotmail и т.д.

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

Программистам на руби в этом плане очень повезло. Есть такой вкусненький джем Blackbook, который способен упростить до 2х строчек кода весь процесс импорта.

По порядку. Ставим:

gem install blackbook

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

Используем:

require ‘rubygems’

require ‘blackbook’
# fetch gmail contacts

gmail_contacts = Blackbook.get :username => ‘bill.gates@gmail.com’,:password => ‘love_sex_rock_n_roll’

gmail_contacts.each do |contact|

p “#{contact[:name]} - #{contact[:email]}\n”

end

Вот и все

Блог работает на WordPress.
Подписка RSS: все записи, комментарии.