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 +5 -0
- data/LICENSE +1 -1
- data/README.rdoc +2 -8
- data/Rakefile +33 -0
- data/lib/formatted_date/conversion.rb +5 -2
- data/lib/formatted_date/conversion_plugin.rb +15 -18
- data/lib/formatted_date/formatting.rb +5 -2
- data/test/conversion_test.rb +46 -0
- data/test/database.yml +4 -0
- data/test/fixtures/schema.rb +8 -0
- data/test/fixtures/user.rb +5 -0
- data/test/fixtures/users.yml +6 -0
- data/test/formatted_date_test.rb +37 -0
- data/test/lib/activerecord_test_case.rb +20 -0
- data/test/lib/activerecord_test_connector.rb +32 -0
- data/test/lib/load_fixtures.rb +9 -0
- data/test/tasks.rake +8 -0
- metadata +13 -2
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
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
|
58
|
-
|
53
|
+
Valor booleano para dizer se o plugin deve validar o(s) atributo(s) caso
|
54
|
+
ele(s) seja(m) inv�lido(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 =
|
49
|
-
if @input.
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
[VALID, parsed]
|
56
|
-
|
57
|
-
[
|
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] =
|
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,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
|
data/test/tasks.rake
ADDED
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.
|
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-
|
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: []
|