formatted_date 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []