Walidatory

Chyba to będzie odpowiedni dział do tego typu problemu.

Otóż… potrzebuję w kilku aplikacjach walidatorów numerów PESEL, NIP i REGON. Kod walidatorów miałem już kiedyś napisany ale, aby nie trzeba było ciągle tego kopiować machnąłem to jako gem. Potem napisałem drugi gem, który tworzy walidatory do rails 3.

developerkę lokalnie mam na Macu ruby 1.9.2-p180
aplikację hostuję na debianie ruby1.9.2-p180

lokalnie wszystkie spece obu gemów działają poprawnie. Apliakacja działa aż miło. Waliduje mi NIP (na razie to sprawdzam w aplikacji).
Gemy się instalują przez bundlera w swoim gemsecie.

Na serwerze gemy się instalują ale wykonanie chociażby rake db:migrate wywala mi błędy

(snip…)/gems/magick_numbers-0.1.3/lib/magick_numbers/nip.rb:2:in `module:MagickNumbers’: uninitialized constant MagickNumbers::Base (NameError)

Szczerze mówiąc nie wiem o co kaman

Możecie rzucić okiem i sprawdzić co jest źle? Czy u was wszystko działa?

po imporcie w irb:

[code]> require ‘magick_numbers’

nip = MagickNumbers::Nip.new “123-45-63-218”
nip.valid?
true[/code]
http://github.com/marioosh/magick_numbers
http://github.com/marioosh/magick_numbers_rails

Kieeedys gdzies czytalem o podobnym problemie i bylo ze niby Dir pod OS X zwraca pliki posrotowane alfabetycznie a na Linuxie niekoniecznie. Nie moge teraz znalezc tego artykulu ale rozwiazaniem bylo chyba poprostu posortowanie przed requirowaniem w stylu

Dir[File.expand_path(File.dirname(__FILE__) + '/magick_numbers/*.rb')].sort.each {|f| require f}

Ja bym po prostu zrobił to ręcznie:

require 'magick_numbers/costam' require 'magick_numbers/cosinnego'
Tak jest najbardziej przejrzyście i poprawnie, używanie Dir w gemach nie jest ładnym rozwiązaniem.

Jeśli już naprawde chcesz to automatyzować zrób task rake który generuje magic_numebrs.rb z requirami :stuck_out_tongue_winking_eye: i generuj :wink: ale jeśli nie masz tam 120 plików rb to po co wogóle ? :stuck_out_tongue: IMHO drogus ma racje.

Dzięki. Teraz śmiga :slight_smile:

Tu masz iban: http://blog.robert.pankowecki.pl/2009/12/walidacja-numeru-iban-konta-bankowego-w.html
Pomyśl nad lepszą nazwą dla gema może co?

dzięki za IBAN przyda się. Z tą nazwą się tak kiedyś spotkałem i przylgnęło nie wiedzieć czemu, jak macie inne propozycje to słucham

bureaucrat :slight_smile: jako że większość tych numerów istnieje tylko w PL może polish_bureaucrat

Podoba mi się nazwa biurokrata. +1

hehe fajnie, podoba mi się :slight_smile:

Też mi się podoba :slight_smile: . Z innych propozycji może official numbers albo goverment numbers. Jako że sa to polskie walidatory to fajnie jakby nazwa to oddawała, żeby innym było łatwo znaleźć. Tylko to starałem się przekazać. Z drugiej strony dedykowana strona dla gema poza githubem mogłaby się dobrze pozycjonować i spełniać swoją rolę poza zamiast nazwy.

A tak wracając do problemu to ja bym użył autoload zamiast tych requier’ów.

Odnośnie nazwy - coś z sum lub checksum. Jest np. projekt library_stdnums, który liczy sumy kontrolne dla ISBN, ISSN i LCCN.
Nazwa “biurokrata” całkiem fajna, ale w praktyce mija się z prawdą - jest wiele numerów tego rodzaju, dla których określono sumy kontrolne - chociażby numery kont bankowych, kart kredytowych, etc.
Fajnie byłoby mieć jedną bibliotekę, która gromadzi tego rodzaju algorytmy.

Dla kart to już jest dobrze rozkminione : https://github.com/Shopify/active_merchant/blob/master/lib/active_merchant/billing/credit_card_methods.rb

To ja mam w sumie kilka sugesti:

  1. Nazwać biblioteke bardziej odpowiednio np Common Number Validators i jeśli będzie się lib rozwijać o ISBN i inne podzielić ją na moduły
  2. Stworzyć wrapery ActiveModel::Validator tak aby można było używać tych klas zgodnie z API ActiveModel

W ten sposób można z tego przyjemnie korzystać we wszystkich derywatach ActiveModel (AR, MongoID etc):

class Person < ActiveRecord::Base validates_with CommonNumberValidators::Polish::Pesel end

Dzięki za wskazówki niedługo wezmę się za realizację, co do wrapperów - to już są. Jak na razie mam dwa gemy magick_numbers i magick_numbers_rails gdzie można używać walidatora np w ten sposób:

class Person < ActiveRecord::Base validates :pesel, :pesel => true end
Co do nazwy to Paweł Kondzior mnie ubiegł. Myślałem o zamianie na CommonNumbers (bez Validators)

Nie zauważyłem tego 2 repo :slight_smile:

odgrzewająć dla zainteresowanych. Udało mi się zrefaktorować te gemy, teraz są obecne pod nazwami common_numbers i common_numbers_rails

Możliwa jest walidacja w ten sposób:

class Item <ActiveRecord::Base validates :pesel, :pesel => true validates_pesel_of :pesel validates_pesel_of :pesel, :message => "nasz własny super message" end
Mam nadzieję, że się komuś przyda.
Potrzebuję w projekcie jeszcze kilka numerów zwalidować, więc na pewno gem się rozrośnie.

Stay tuned :slight_smile:

Zabieram się właśnie za przepisanie mojej lipnej pracy inżynierskiej w gem(mój pierwszy - pewnie będzie jeszcze bardziej lipny niż oryginalna praca :stuck_out_tongue: ) generujący numery nip,pesel,regon,dowodów osobistych etc (coś a’la faker gem) - jeżeli marioosh nie bierzesz tej nazwy to pozwól, że ja ją sobie przywłaszczę :smiley:

Cześć,

Możecie podpowiedzieć, jakich używacie gemów do weryfikowania PESEL-a pod Rails 4.2?