Постове 1 - 5 от 8 в категория ruby

Aug 15

Едно от основните неща който се налага да има в едно приложение е качване на файлове. И докато за PHP работата с прикачени файлове се учи и прави твърде лесно. При Rails е малко по-трудно, но пък за това има множество плъгини, които улесняват този процес. Най-много ми допада Paperclip, на Thoughtbot. На Thoughtbot използвам и още две техни неща Factory Girl и Shoulda, както и наблюдавам и развитието на Clearance.

Исках и да тествам дали Paperclip е наместен както трябва в моето приложение. Което е доста лесно. Проблемът е, че липсва каквато и да е документация по въпроса. Но съм малко ровене в ruby кода и опити успях да разбера как става това. И тъй като може и на други хора да им трябва подобно нещо реших да споделя наученото.

За тестване използвам RSpec с малко помощ от Shoulda. А Paperclip го използвам като plugin, а не като gem (което за този пост мисля, че няма голямо значение).

Така, по същество. От Thoughtbot са сложили в самия Paperclip четири валидиращи метода (намират се в lib/paperclip/matchers.rb):

  1. have_attached_file
  2. validate_attachment_presence
  3. validate_attachment_size
  4. validate_attachment_content_type

Лошото е че в документацията на Paperclip, няма много(да не кажа никаква) информация за тях, като начин на ползване и как да се добавят в тестовете.

Добавяне на matcher-ите в RSpec тестовете

Това се оказа по-лесно от колкото предполагах просто във вашия spec_helper.rb добавяте следното:

require 'paperclip/matchers'

Spec::Runner.configure do |config|
 config.include Paperclip::Shoulda::Matchers
end

И воала вече може да използвате горе споменатите matcher-и. Обаче с малко засрамено ще кажа, че ми отне доста време да стигна до тези редове. Много ми помогна този урок от Railscasts – RSpec Matchers & Macros.

Същинското тестване

Тук нещата не са толкова трудни, но много зависи от съответните изисквания за вашето приложение.

class Product < ActiveRecord::Base
  has_attached_file :picture,
                     :path   => ":rails_root/public/files/:class/:id/:style.:extension",
                     :styles => {:original => "800x600>", :small => "102x76" }
end

describe Product do
  it { Product.should have_attached_file(:picture) }
  it { Product.should validate_attachment_presence(:picture) }
  it { Product.should validate_attachment_size(:picture).in(1..1.megabytes) }
  it { Product.should validate_attachment_content_type(:picture).
                        allowing(%w(image/png image/jpeg)).
                        rejecting(%w(audio/mp3 application/octet-stream)) }
end

Според мен този код говори сам за себе си.

PaperClip

Неща които трябва да се отбележат. Първото, за разлика от повечето Shoulda matcherи не може да се ползва само “should”, а трябва да се пише името на модела, който се тества “Product.should”. Другото нещо което ми отне малко повече време да го разбера. А именно, че validate_attachment_content_type когато се вика трябва задължително да има allowing и rejecting, който описват типовете който може да се ползват за дадения файл.

Лично за мен беше доста полезно да видя как работят Paperclip matcherи от вътре.

Надявам се да съм бил полезен на някого с този пост и да съм му спестил време в ровене и търсене :) Ако някой има идеи и предложение ще се радвам да ги чуя.

Dec 24

По Коледа наистина стават чудеса! Преди минути прочетох това в официалния блог на RubyOnRails:

Merb gets merged into Rails 3!

В първия момент си помислих: май наистина съм страшно много настинал, че чак ми се  привиждат някакви странни неща.
После пак погледнах и този път погледнах и датата да не е случайно дошъл вече първи Април. :)

Но май няма лъжа. няма измама Merb влиза в Rails от версия 3та. Страхотна и супер не очаквана новина.

Малко подробности по въпроса: като за начало към края на Януари се чака  Rails 2.3 и след това се започва Rails 3.0.  През това време за Merb ще се правят bugfixoве и release-и,  и естесвено няма да се оставят на произвола на съдбата сегашние Merb поребители. Като ще се гледа да може лесно да се мигрира от Rails 2.x и Merb1.x (мисля че са 1 нещо) към Rails 3.0. Като Yehuda Katz вече е в the Rails core team.

Фокусите какви ще са:

  • Ефективност, скорост и scalability
  • Да бъде по свободен самия framework в смисъл да може да се заменя ActiveRecord с DataMapper или друг, да се ползва друг UnitTest framework и т.н. Като пак ще се запазят подразбиранията.
  • По “взискателно” API

За повече подробности може да прочетете самата новина в поста, както и в блога на Yehuda Katz.

Не съм видял още много коментари по случая но, най-вероятно Rails хората ще са супер доволни, докато върлите Merbисти не толкова, но скоро и те ще разберат положителните страни :)

Просто Ruby общността непрестанно ме изненадва в добия смисъл на думата. Някакси не виждам как може CodeIgniter и CakePHP да се обединят.  Но това е да си воден единствено от желанието да правиш нещо възможно най-добре и най-качествено. :)

п.п. Не съм сигурен, но май аз съм първия в България, който пише за това :)

Sep 19

Microsoft най-сетне решиха да отвърнат на удара на Mac vs Pc ads, които Apple правят от години, с това:

Не знам, нещо не ми харесва. Дали защото съм фен на Apple. А и само като се сетя за Windows мизериите, ми се иска да си сипя едни “успокояващ чай”, и явно не само аз искам това:

A и гледам, че има нови 2-3 епизода от серията “Mac vs PC” – https://www.apple.com/getamac/ads/.

п.п. Чесно казано най-добрата реклама, която Apple имат се вижда тук (само забележете колко хора са MacBookPro и колко са с нещо друго). А и самата конференция е била доста интересна, и тия дни смятам да я прегледам.

Sep 07

Онзи ден трябваше да кача файлове на ftp сървър, нищо интересно. Проблема е че са ми много досадни повечетo FTP клиенти за Windows, просто една свястна FTP програма няма.

Днес имах малко свободно време и реших да направя нещо, което от доста време си мисля. А то е просто скиптче което само да го стартирам и то да си качи каквото трябва на избрано от мен място на ftp сървър (после мисля да го направя да прави и други работи, но за друг път)

Избрах си да го напиша на Ruby или по-точно JRuby, защото така и така го имах инсталирано и все се чудех за какво да го ползвам. Оказа че Ruby има наистина богат набор от стандартни класове. Поне за сега възползвах от Logger и Net::FTP.

Много харесвам Ruby като език, особено block-овете :) Но е малко по различен от това с което съм работи до сега, например с PHP да направя нещо да обикаля директория и нейните под-директори е просто нещо такова:

function read_dir($directory){
	foreach(new DirectoryIterator($directory) as $file){
		if ($file == '.' || $file == '..') continue;

		if ($file->isDir()){
			read_dir($file->getRealPath());
			// do something with directory
		} else{
			// do something with file
		}
	}
}

read_dir('my_dir');

или ползвам RecursiveDirectoryIterator, за който все забравям че съществува.

Пробвах да напиша нещо на същия принцип с ruby, но не стана много добре, даже никак добре не стана. Работеше, но бях се по оплел със функции, Proc :( Порових малко в net-a и с малко работа  написах това:

def read_dir (path, &block)
	paths = [path]
	while file = paths.shift
		yield file.dup
		next unless File.directory? file
		for f in  Dir.open( file )
			next if f == '.' or f == '..'
			paths.unshift File.join(file,  f)
		end
	end
end

read_dir('my_dir') do |file|
	# do something with file
end

Винаги съм мислил, че за да се обиколи директория и нейните под-директории трябва някаква рекурсия или нещо такова. А се по този начин просто се пазят всичките директории в масив(или опашка) и просто се обикаля докато се свърши масива.

Обаче се оказа че в Ruby вече има такова нещо – Find:

require 'find'
Find.find('my_dir') do |file|
	# do something with file
end

Е малко това Find.find() не ми харесва как изглежда, но само със едно “alias :find :from”, може да имаме Find.from() което да е същото :) А ако сте фенове на Monkey patch може да се вложи Find.find във File класа и да се направят още доста “магии”.

Sep 05

Днес видях, че голяма част от Rails Conf 29.05-01.06 Portland Oregon я има качена в интернет:

http://railsconf.blip.tv/

Колко жалко, че няма голяма вероятност в близките 2-3 години да присъствам на Rails Conf, но какво да се прави такъв е живота. Поне мога да я гледам ! :)

Поне от сесиите, които можах да видя, за сега, най-много ми харесаха тези:

  1. David Heinemeier Hansson – Keynote ( #1170044 )
  2. Joel Spolsky – Fog Creek Software ( #1170255 )
  3. Hansson, Kemper, Koziarski, Olson – Rails Core Panel ( #1170296 )

Но все още ми остават 3,4,5 части, така че може и още 1-2 линкчета да сложа в този списък.