formatted_date 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,8 @@
1
+ == 1.1.0 released 2009-11-16
2
+
3
+ * Adicionados alguns testes
4
+ * Corre��o de dois pequenos bugs. O plugin n�o respeitava a op��o <tt>format</tt>. Estava faltando uma verifica��o no range da data caso j� fosse passado uma data para convers�o e n�o uma string.
5
+
1
6
  == 1.0.0 released 2009-11-10
2
7
 
3
8
  * Primeiro release
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 Ícaro Leopoldino da Motta
1
+ Copyright (c) 2009 �caro Leopoldino da Motta
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.rdoc CHANGED
@@ -14,8 +14,6 @@ n
14
14
  consideradas inv�lidas). Para capturar esses erros existe o famoso
15
15
  <tt>validates_presence_of</tt>.
16
16
 
17
- ----
18
-
19
17
  === Configura��o
20
18
 
21
19
  No arquivo <i>config/environment.rb</i> adicione o seguinte:
@@ -25,8 +23,6 @@ No arquivo <i>config/environment.rb</i> adicione o seguinte:
25
23
  E ent�o execute a task:
26
24
 
27
25
  rake gems:install
28
-
29
- ----
30
26
 
31
27
  === Exemplos
32
28
 
@@ -54,8 +50,8 @@ abaixo.
54
50
  <tt>default</tt>::
55
51
  O padr�o � <tt>nil</tt>, mas qualquer valor pode ser passado.
56
52
  <tt>validate</tt>::
57
- Valor booleano para dizer se o plugin deve adicionar uma mensagem de erro caso
58
- a data n�o seja vlida. Padr�o <tt>true</tt>.
53
+ Valor booleano para dizer se o plugin deve validar o(s) atributo(s) caso
54
+ ele(s) seja(m) invlido(s). Padr�o <tt>true</tt>.
59
55
  <tt>message</tt>::
60
56
  Mensagem a ser exibida caso ocorra algum erro na convers�o para uma data.
61
57
  O padr�o � uma mensagem do tipo <tt>invalid</tt> definida no seu arquivo de
@@ -66,8 +62,6 @@ abaixo.
66
62
  <tt>range</tt>::
67
63
  Intervalo v�lido para a(s) data(s). Deve ser do tipo <tt>Range</tt>.
68
64
  Padr�o: 1850 � 2038.
69
-
70
- ----
71
65
 
72
66
  === M�dulo de Convers�o
73
67
 
data/Rakefile ADDED
@@ -0,0 +1,33 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/clean'
4
+ require 'rake/gempackagetask'
5
+ load 'test/tasks.rake'
6
+
7
+ FORMATTED_DATE_VERSION = '1.1.0'
8
+ CLEAN.include('pkg')
9
+
10
+ spec = Gem::Specification.new do |s|
11
+ s.platform = Gem::Platform::RUBY
12
+ s.name = "formatted_date"
13
+ s.summary = "Customize o formato de datas no Rails."
14
+ s.description = "Customize o formato de datas no Rails."
15
+ s.version = FORMATTED_DATE_VERSION
16
+
17
+ s.author = "Ícaro Leopoldino da Motta"
18
+ s.email = "icaro.ldm@gmail.com"
19
+
20
+ s.has_rdoc = true
21
+ s.require_path = "lib"
22
+
23
+ s.extra_rdoc_files = %w( README.rdoc CHANGELOG.rdoc )
24
+ s.files = FileList['init.rb', 'README.rdoc', 'CHANGELOG.rdoc', 'LICENSE', 'Rakefile', 'rails/init.rb', 'lib/**/*', 'test/**/*']
25
+ end
26
+
27
+ Rake::GemPackageTask.new(spec) do |pkg|
28
+ pkg.define
29
+ end
30
+
31
+ task :build => [:clean, :repackage]
32
+
33
+ task :default => :test
@@ -2,7 +2,9 @@ module FormattedDate
2
2
 
3
3
  module Conversion
4
4
 
5
+ #:stopdoc:
5
6
  DefaultOptions = FormattedDate::DefaultOptions.tap { |opts| opts.delete(:message); opts.delete(:validate) }
7
+ #:startdoc:
6
8
 
7
9
  #
8
10
  # Tenta fazer a convers�o de cada uma das datas. Em caso de erro,
@@ -44,12 +46,13 @@ module FormattedDate
44
46
  options[:default]
45
47
  end
46
48
  end
47
- elsif date.is_a?(Time) || date.is_a?(Date)
48
- date
49
+ elsif date.is_a?(Time) || date.is_a?(Date) || date.is_a?(DateTime)
50
+ options[:range].include?(date.year) ? date : options[:default]
49
51
  else
50
52
  options[:default]
51
53
  end
52
54
  end
55
+
53
56
  dates.many? ? dates : dates.first
54
57
  end
55
58
  end
@@ -44,27 +44,24 @@ module FormattedDate
44
44
 
45
45
  private
46
46
 
47
- def perform_conversion(klass)
48
- @status, @output = if @input.is_a? String
49
- if @input.blank?
50
- [INVALID, @options.default]
51
- else
52
- begin
53
- parsed = klass.strptime(@input, @options.format)
54
- if @options.range.include? parsed.year
55
- [VALID, parsed]
56
- else
57
- [OUT_OF_RANGE, @options.default]
47
+ def perform_conversion(klass)
48
+ @status, @output =
49
+ if @input.is_a? String
50
+ if @input.blank?
51
+ [INVALID, @options.default]
52
+ else
53
+ begin
54
+ parsed = klass.strptime(@input, @options.format)
55
+ @options.range.include?(parsed.year) ? [VALID, parsed] : [OUT_OF_RANGE, @options.default]
56
+ rescue ArgumentError
57
+ [PARSE_FAIL, @options.default]
58
58
  end
59
- rescue ArgumentError
60
- [PARSE_FAIL, @options.default]
61
59
  end
60
+ elsif @input.is_a?(Time) || @input.is_a?(Date) || @input.is_a?(DateTime)
61
+ @options.range.include?(@input.year) ? [VALID, @input] : [OUT_OF_RANGE, @options.default]
62
+ else
63
+ [INVALID, @options.default]
62
64
  end
63
- elsif @input.is_a?(Time) || @input.is_a?(Date)
64
- [VALID, @input]
65
- else
66
- [INVALID, @options.default]
67
- end
68
65
 
69
66
  @output
70
67
  end
@@ -1,5 +1,6 @@
1
1
  module FormattedDate
2
2
 
3
+ #:stopdoc:
3
4
  DefaultOptions = {
4
5
  :format => '%d/%m/%Y',
5
6
  :default => nil,
@@ -8,6 +9,7 @@ module FormattedDate
8
9
  :message => :invalid,
9
10
  :type => :datetime
10
11
  }
12
+ #:startdoc:
11
13
 
12
14
  #
13
15
  # Formata as datas de acordo com o formato passado.
@@ -37,7 +39,7 @@ module FormattedDate
37
39
  # pela op��o <format>.
38
40
  #
39
41
  define_method "#{name}_before_type_cast" do
40
- if self[name].is_a?(Time) || self[name].is_a?(Date)
42
+ if self[name].is_a?(Time) || self[name].is_a?(Date) || self[name].is_a?(DateTime)
41
43
  self[name].strftime(options[:format])
42
44
  else
43
45
  self.read_attribute_before_type_cast(name)
@@ -50,6 +52,7 @@ module FormattedDate
50
52
  define_method "#{name}=" do |value|
51
53
  conv = ConversionPlugin.new(value, options)
52
54
  date = conv.convert!
55
+
53
56
  if conv.valid?
54
57
  self[name] = date.strftime(options[:db_format])
55
58
  else # data inv�lida
@@ -57,7 +60,7 @@ module FormattedDate
57
60
  # sabemos que ela � inv�lida. De qualquer forma � necess�rio porque
58
61
  # depois n�s devemos ser capazes de resgatar a data sem o cast
59
62
  # (valor de entrada original).
60
- self[name] = value
63
+ self[name] = date
61
64
 
62
65
  if options[:validate]
63
66
  self.class.class_eval do
@@ -0,0 +1,46 @@
1
+ require 'test/unit'
2
+ require 'test/lib/activerecord_test_case'
3
+ require 'test/lib/load_fixtures'
4
+ require 'lib/formatted_date/conversion'
5
+
6
+ class ConversionTest < ActiveRecordTestCase
7
+ def test_conversion_methods
8
+ datetime = to_datetime('26/11/1986')
9
+ date = to_date('26/11/1986')
10
+ assert_equal date, datetime.to_date
11
+ end
12
+
13
+ def test_return_type
14
+ date = to_datetime(Time.now)
15
+ dates = to_datetime(1.year.ago, nil, '21/12/2012')
16
+ assert_kind_of Time, date
17
+ assert_kind_of Array, dates
18
+ end
19
+
20
+ def test_format_option
21
+ date = to_datetime('2000 - 24/01 - [15h 30min]', :format => '%Y - %d/%m - [%Hh %Mmin]')
22
+ assert_kind_of DateTime, date
23
+ end
24
+
25
+ def test_default_option
26
+ date_01, date_02 = to_datetime(nil, '30/02/2000', :default => Time.now)
27
+ assert_kind_of Time, date_01
28
+ assert_kind_of Time, date_02
29
+ end
30
+
31
+ def test_range_option
32
+ date_01, date_02 = to_datetime('26/11/1986', '01/01/2001', :range => 1980..2000)
33
+ assert_kind_of DateTime, date_01
34
+ assert_nil date_02
35
+ end
36
+
37
+ private
38
+
39
+ def to_datetime(*args)
40
+ FormattedDate::Conversion.to_datetime(*args)
41
+ end
42
+
43
+ def to_date(*args)
44
+ FormattedDate::Conversion.to_date(*args)
45
+ end
46
+ end
data/test/database.yml ADDED
@@ -0,0 +1,4 @@
1
+ sqlite3:
2
+ database: ":memory:"
3
+ adapter: sqlite3
4
+ timeout: 500
@@ -0,0 +1,8 @@
1
+ ActiveRecord::Schema.define do
2
+ create_table :users, :force => true do |t|
3
+ t.string :name
4
+ t.datetime :born_at, :alone_since
5
+ t.date :first_job_on
6
+ t.timestamps
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ class User < ActiveRecord::Base
2
+ formatted_date :born_at, :range => 1930..2050
3
+ formatted_date :alone_since, :format => '%d-%m-%Y'
4
+ formatted_date :first_job_on, :default => Date.today, :type => :date
5
+ end
@@ -0,0 +1,6 @@
1
+ icaro:
2
+ id: 1
3
+ name: Icaro L. da Motta
4
+ born_at: <%= 22.years.ago %>
5
+ created_at: <%= Time.now %>
6
+ updated_at: <%= Time.now %>
@@ -0,0 +1,37 @@
1
+ require 'test/unit'
2
+ require 'test/lib/activerecord_test_case'
3
+ require 'test/lib/load_fixtures'
4
+
5
+ class FormattedDateTest < ActiveRecordTestCase
6
+ fixtures :users
7
+
8
+ def setup
9
+ @user = User.first
10
+ end
11
+
12
+ def test_format_option
13
+ @user.alone_since = '26-11-1986'
14
+ assert_kind_of Time, @user.alone_since
15
+ end
16
+
17
+ def test_default_option
18
+ @user.first_job_on = nil
19
+ assert_kind_of Date, @user.first_job_on
20
+ end
21
+
22
+ def test_range_option
23
+ @user.born_at = 200.years.ago
24
+ assert_nil @user.born_at
25
+ @user.born_at = Time.now
26
+ assert_kind_of Time, @user.born_at
27
+ end
28
+
29
+ def test_before_type_cast
30
+ @user.born_at = '30/02/2000'
31
+ @user.alone_since = 'ancient times'
32
+ assert_nil @user.born_at_before_type_cast
33
+ assert_nil @user.alone_since_before_type_cast
34
+ @user.born_at = '21/12/2012'
35
+ assert_equal '21/12/2012', @user.born_at_before_type_cast
36
+ end
37
+ end
@@ -0,0 +1,20 @@
1
+ require 'lib/activerecord_test_connector'
2
+
3
+ class ActiveRecordTestCase < Test::Unit::TestCase
4
+ if defined? ActiveSupport::Testing::SetupAndTeardown
5
+ include ActiveSupport::Testing::SetupAndTeardown
6
+ end
7
+
8
+ if defined? ActiveRecord::TestFixtures
9
+ include ActiveRecord::TestFixtures
10
+ end
11
+
12
+ self.fixture_path = ActiveRecordTestConnector::FIXTURES_PATH
13
+ self.use_transactional_fixtures = true
14
+
15
+ def self.fixtures(*args)
16
+ super
17
+ end
18
+ end
19
+
20
+ ActiveRecordTestConnector.setup
@@ -0,0 +1,32 @@
1
+ require 'rubygems'
2
+ require 'active_record'
3
+ require 'active_record/fixtures'
4
+
5
+ class ActiveRecordTestConnector
6
+ FIXTURES_PATH = File.join(File.dirname(__FILE__), '..', 'fixtures')
7
+
8
+ def self.setup
9
+ setup_connection
10
+ load_schema
11
+ add_load_path FIXTURES_PATH
12
+ end
13
+
14
+ private
15
+
16
+ def self.add_load_path(path)
17
+ dep = defined?(ActiveSupport::Dependencies) ? ActiveSupport::Dependencies : ::Dependencies
18
+ dep.load_paths.unshift path
19
+ end
20
+
21
+ def self.load_schema
22
+ ActiveRecord::Base.silence do
23
+ ActiveRecord::Migration.verbose = false
24
+ load File.join(FIXTURES_PATH, 'schema.rb')
25
+ end
26
+ end
27
+
28
+ def self.setup_connection
29
+ configurations = YAML.load_file(File.join(File.dirname(__FILE__), '..', 'database.yml'))
30
+ ActiveRecord::Base.establish_connection configurations['sqlite3']
31
+ end
32
+ end
@@ -0,0 +1,9 @@
1
+ require 'lib/activerecord_test_connector'
2
+
3
+ # setup the connection
4
+ ActiveRecordTestConnector.setup
5
+
6
+ # load all fixtures
7
+ Fixtures.create_fixtures(ActiveRecordTestConnector::FIXTURES_PATH, ActiveRecord::Base.connection.tables)
8
+
9
+ require 'formatted_date'
data/test/tasks.rake ADDED
@@ -0,0 +1,8 @@
1
+ require 'rake/testtask'
2
+
3
+ desc 'Testa o plugin formatted_date'
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.pattern = 'test/**/*_test.rb'
6
+ t.verbose = true
7
+ t.libs << 'test'
8
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: formatted_date
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - "\xC3\x8Dcaro Leopoldino da Motta"
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-10 00:00:00 -02:00
12
+ date: 2009-11-16 00:00:00 -02:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -27,11 +27,22 @@ files:
27
27
  - README.rdoc
28
28
  - CHANGELOG.rdoc
29
29
  - LICENSE
30
+ - Rakefile
30
31
  - rails/init.rb
31
32
  - lib/formatted_date/conversion.rb
32
33
  - lib/formatted_date/conversion_plugin.rb
33
34
  - lib/formatted_date/formatting.rb
34
35
  - lib/formatted_date.rb
36
+ - test/conversion_test.rb
37
+ - test/database.yml
38
+ - test/fixtures/schema.rb
39
+ - test/fixtures/user.rb
40
+ - test/fixtures/users.yml
41
+ - test/formatted_date_test.rb
42
+ - test/lib/activerecord_test_case.rb
43
+ - test/lib/activerecord_test_connector.rb
44
+ - test/lib/load_fixtures.rb
45
+ - test/tasks.rake
35
46
  has_rdoc: true
36
47
  homepage:
37
48
  licenses: []