date_parity 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -2,3 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in date_parity.gemspec
4
4
  gemspec
5
+
6
+ gem "debugger"
data/README.md CHANGED
@@ -2,13 +2,13 @@
2
2
 
3
3
  Date formatting and parsing per request in Rails with parity between date.to\_s.and string.to\_date.
4
4
 
5
- Rails already has some great Date formatting and parsing options available. For example, Date.DATE\_FORMATS makes it easy to configure and reuse common formats for your application. But, other then the :default it require an explicit field.to\_s(:format) to be applied. Additionally, nothing happens automatically when parsing those dates back from user edits. This generally require some explicit steps per field in your model or controller.
5
+ Rails has some great Date formatting and parsing options available. But, it still requires a lot of helping code to consistently parse and display dates in a particular format . For example, Date.DATE\_FORMATS makes it easy to configure and reuse common formats for your application. But, other then the :default it require an explicit field.to\_s(:format) to be applied. Additionally, nothing happens automatically when parsing those dates back from user edits. This generally require some explicit steps per field in your model or controller.
6
6
 
7
7
  Rails also provides the ability to localize your Date formats. But, that requires decisions made for all users in a particular locale.
8
8
 
9
- Often, we need to allow users, companies, organizations, etc. the ability to choose preferred date formats. Both of the Rails standard approaches using Date.DATE\_FORMATS or localization fall short at making that easy. You end up writing a lot helpers around date fields, and code to normalize posted date values.
9
+ Often, we need to allow users, companies, organizations, etc. the ability to choose preferred date formats. Both of the Rails standard approaches using Date.DATE\_FORMATS or localization fall short at making that easy; especially when parsing user form posted date strings. You end up writing a lot helpers around date fields, and code to normalize posted date values.
10
10
 
11
- This is where date\_parity helps. It is implemented by setting a `Date.format` string, similar to a per user `Time.zone` in Rails. This can be set per request (i.e. per user) in a controller's before\_filter or around\_filter.
11
+ This is where date\_parity helps. It is implemented by setting a `Date.format` string, similar to a per user `Time.zone` in Rails. This can be set per request (i.e. per user) in a controller's before\_action or around\_action.
12
12
 
13
13
  For example:
14
14
  ```ruby
@@ -51,6 +51,9 @@ date.to_s
51
51
 
52
52
  ## Installation
53
53
 
54
+ Date Parity >= 0.1.0 works with Rails 4.0 onwards.
55
+ Date Parity 0.0.3 works with Rails 3.
56
+
54
57
  Add this line to your application's Gemfile:
55
58
 
56
59
  gem 'date_parity'
@@ -65,7 +68,7 @@ Or install it yourself as:
65
68
 
66
69
  ## Usage
67
70
 
68
- In a Rails controller before\_filter:
71
+ In a Rails controller before\_action:
69
72
  ```Date.format = '%m/%d/%Y'```
70
73
 
71
74
  Generally, you will want to set that string based on user preference, as in:
@@ -77,9 +80,9 @@ Then in any view assuming @model\_started\_on is a date field, and Date.format w
77
80
  #=> '12/31/2012'
78
81
  ```
79
82
 
80
- And then you get parity when a form with this field is posted. Rails will attempt to convert the posted string value of "12/31/2012" using Date.\_parse, which DateParity overrides and respects your Date.format.
83
+ And then you get parity when a form with this field is posted. Rails will attempt to convert the posted string value of "12/31/2012" using Date.\parse, which DateParity overrides and respects your Date.format.
81
84
 
82
- Without the date\_parity gem, @model.start\_on would have ended up nil because "12/31/2012" is an invalid argument for ruby Date.\_parse. However, when date\_parity is included, Date will use the format string set on Date.format to correctly parse "12/31/2012", as December 31, 2012, when Date.format = "%m/%d/%Y".
85
+ Without the date\_parity gem, @model.start\_on would have ended up nil because "12/31/2012" is an invalid argument for ruby Date.\parse. However, when date\_parity is included, Date will use the format string set on Date.format to correctly parse "12/31/2012", as December 31, 2012, when Date.format = "%m/%d/%Y".
83
86
 
84
87
  Note: Rails text\_field form helper uses ```@model.attribute_before_type_cast``` by default. When using date\_parity on plain text fields, you will probably want to set your value to explicitly use @model.attribute if it exists. Otherwise, you won't see the formatted date field: For example:
85
88
  ```ruby
data/date_parity.gemspec CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |gem|
11
11
  gem.summary = 'Rails Date formatting and parsing with full parity between date.to_s.and string.to_date per request.'
12
12
  gem.homepage = ""
13
13
 
14
- gem.add_dependency 'activesupport', '>= 3.2'
14
+ gem.add_dependency 'activesupport', '>= 4.0.0'
15
15
 
16
16
  gem.add_development_dependency 'rake'
17
17
  gem.add_development_dependency 'minitest'
@@ -7,16 +7,16 @@ class Date
7
7
  Thread.current[:date_format] = format
8
8
  end
9
9
 
10
- def _parse_with_date_parity_format(string, comp=false)
11
- return _parse_without_date_parity_format(string, comp) if string.blank? or Date.format.blank?
10
+ def parse_with_date_parity_format(string, comp=false)
11
+ return parse_without_date_parity_format(string, comp) if string.blank? or Date.format.blank?
12
12
  # normalize date by first respecting custom date_parity Date.format,
13
13
  # then formatting back to iso/db string for normal _parse call.
14
- _parse_without_date_parity_format(Date.strptime(string, Date.format).to_s(:db), comp)
15
- rescue
16
- _parse_without_date_parity_format(string, comp)
14
+ parse_without_date_parity_format(Date.strptime(string, Date.format).to_s(:db), comp)
15
+ #rescue
16
+ #parse_without_date_parity_format(string, comp)
17
17
  end
18
18
 
19
- alias_method_chain :_parse, :date_parity_format
19
+ alias_method_chain :parse, :date_parity_format
20
20
  end
21
21
 
22
22
  end
@@ -1,3 +1,3 @@
1
1
  module DateParity
2
- VERSION = "0.0.3"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -1,10 +1,15 @@
1
1
  require 'date_parity/test_helper'
2
+ require 'debugger'
2
3
 
3
4
  class DateParityTest < MiniTest::Unit::TestCase
4
5
 
6
+ def setup
7
+ # Reset Date.format from previous test
8
+ Date.format = nil
9
+ end
10
+
5
11
  def test_date_to_string_respects_format
6
12
  date = Date.parse("2012-08-12")
7
-
8
13
  Date.format = "%m/%d/%Y"
9
14
  assert_equal "08/12/2012", date.to_s
10
15
 
@@ -29,44 +34,56 @@ class DateParityTest < MiniTest::Unit::TestCase
29
34
  date_hash = { :year => 2012, :mon => 8, :mday => 12 }
30
35
 
31
36
  Date.format = "%m/%d/%Y"
32
- assert_equal date_hash, Date._parse("08/12/2012")
37
+ assert_equal date_hash[:mday], Date.parse("08/12/2012").mday
38
+ assert_equal date_hash[:mon], Date.parse("08/12/2012").mon
39
+ assert_equal date_hash[:year], Date.parse("08/12/2012").year
33
40
 
34
41
  Date.format = "%d/%m/%Y"
35
- assert_equal date_hash, Date._parse("12/08/2012")
42
+ assert_equal date_hash[:mday], Date.parse("12/08/2012").mday
43
+ assert_equal date_hash[:mon], Date.parse("12/08/2012").mon
44
+ assert_equal date_hash[:year], Date.parse("12/08/2012").year
36
45
 
37
46
  Date.format = '%Y-%m-%d'
38
- assert_equal date_hash, Date._parse("2012-08-12")
47
+ assert_equal date_hash[:mday], Date.parse("2012-08-12").mday
48
+ assert_equal date_hash[:mon], Date.parse("2012-08-12").mon
49
+ assert_equal date_hash[:year], Date.parse("2012-08-12").year
39
50
 
40
51
  Date.format = '%d.%m.%Y'
41
- assert_equal date_hash, Date._parse("12.08.2012")
52
+ assert_equal date_hash[:mday], Date.parse("12.08.2012").mday
53
+ assert_equal date_hash[:mon], Date.parse("12.08.2012").mon
54
+ assert_equal date_hash[:year], Date.parse("12.08.2012").year
42
55
 
43
56
  Date.format = '%Y.%m.%d'
44
- assert_equal date_hash, Date._parse("2012.08.12")
57
+ assert_equal date_hash[:mday], Date.parse("2012.08.12").mday
58
+ assert_equal date_hash[:mon], Date.parse("2012.08.12").mon
59
+ assert_equal date_hash[:year], Date.parse("2012.08.12").year
45
60
 
46
61
  Date.format = '%Y/%m/%d'
47
- assert_equal date_hash, Date._parse("2012/08/12")
62
+ assert_equal date_hash[:mday], Date.parse("2012/08/12").mday
63
+ assert_equal date_hash[:mon], Date.parse("2012/08/12").mon
64
+ assert_equal date_hash[:year], Date.parse("2012/08/12").year
48
65
  end
49
66
 
50
67
  def test_string_to_date_respects_format
51
68
  # This works because Rails ActiveSupport provides
52
69
  # string.to_date, which uses Date._parse
53
70
  Date.format = "%m/%d/%Y"
54
- assert_equal Date.parse("2012-08-12"), "08/12/2012".to_date
71
+ assert_equal Date.parse_without_date_parity_format("2012-08-12"), "08/12/2012".to_date
55
72
 
56
73
  Date.format = "%d/%m/%Y"
57
- assert_equal Date.parse("2012-08-12"), "12/08/2012".to_date
74
+ assert_equal Date.parse_without_date_parity_format("2012-08-12"), "12/08/2012".to_date
58
75
 
59
76
  Date.format = '%Y-%m-%d'
60
- assert_equal Date.parse("2012-08-12"), "2012-08-12".to_date
77
+ assert_equal Date.parse_without_date_parity_format("2012-08-12"), "2012-08-12".to_date
61
78
 
62
79
  Date.format = '%d.%m.%Y'
63
- assert_equal Date.parse("2012-08-12"), "12.08.2012".to_date
80
+ assert_equal Date.parse_without_date_parity_format("2012-08-12"), "12.08.2012".to_date
64
81
 
65
82
  Date.format = '%Y.%m.%d'
66
- assert_equal Date.parse("2012-08-12"), "2012.08.12".to_date
83
+ assert_equal Date.parse_without_date_parity_format("2012-08-12"), "2012.08.12".to_date
67
84
 
68
85
  Date.format = '%Y/%m/%d'
69
- assert_equal Date.parse("2012-08-12"), "2012/08/12".to_date
86
+ assert_equal Date.parse_without_date_parity_format("2012-08-12"), "2012/08/12".to_date
70
87
  end
71
88
 
72
89
  def test_invalid_date_still_raises_argument_error
@@ -80,7 +97,7 @@ class DateParityTest < MiniTest::Unit::TestCase
80
97
 
81
98
  def full_date_parity
82
99
  Date.format = "%m/%d/%Y"
83
- date = Date.parse("2012-12-31")
100
+ date = Date.parse_without_date_parity_format("2012-12-31")
84
101
  assert date, date.to_s.to_date
85
102
 
86
103
  assert "12/31/2012", "12/31/2012".to_date.to_s
metadata CHANGED
@@ -1,49 +1,64 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: date_parity
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
5
4
  prerelease:
5
+ version: 0.1.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Scott Stewart
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-14 00:00:00.000000000 Z
12
+ date: 2013-06-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: activesupport
16
- requirement: &70323438102960 !ruby/object:Gem::Requirement
17
- none: false
15
+ version_requirements: !ruby/object:Gem::Requirement
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
21
- version: '3.2'
19
+ version: 4.0.0
20
+ none: false
21
+ name: activesupport
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70323438102960
25
- - !ruby/object:Gem::Dependency
26
- name: rake
27
- requirement: &70323438102540 !ruby/object:Gem::Requirement
24
+ requirement: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ! '>='
27
+ - !ruby/object:Gem::Version
28
+ version: 4.0.0
28
29
  none: false
30
+ - !ruby/object:Gem::Dependency
31
+ version_requirements: !ruby/object:Gem::Requirement
29
32
  requirements:
30
33
  - - ! '>='
31
34
  - !ruby/object:Gem::Version
32
35
  version: '0'
36
+ none: false
37
+ name: rake
33
38
  type: :development
34
39
  prerelease: false
35
- version_requirements: *70323438102540
36
- - !ruby/object:Gem::Dependency
37
- name: minitest
38
- requirement: &70323438102080 !ruby/object:Gem::Requirement
40
+ requirement: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
39
45
  none: false
46
+ - !ruby/object:Gem::Dependency
47
+ version_requirements: !ruby/object:Gem::Requirement
40
48
  requirements:
41
49
  - - ! '>='
42
50
  - !ruby/object:Gem::Version
43
51
  version: '0'
52
+ none: false
53
+ name: minitest
44
54
  type: :development
45
55
  prerelease: false
46
- version_requirements: *70323438102080
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ! '>='
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ none: false
47
62
  description: Rails Date formatting and parsing with full parity between date.to_s.and
48
63
  string.to_date per request.
49
64
  email: scottpstewart@gamil.com
@@ -69,26 +84,20 @@ rdoc_options: []
69
84
  require_paths:
70
85
  - lib
71
86
  required_ruby_version: !ruby/object:Gem::Requirement
72
- none: false
73
87
  requirements:
74
88
  - - ! '>='
75
89
  - !ruby/object:Gem::Version
76
90
  version: '0'
77
- segments:
78
- - 0
79
- hash: -101513963914939075
80
- required_rubygems_version: !ruby/object:Gem::Requirement
81
91
  none: false
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
93
  requirements:
83
94
  - - ! '>='
84
95
  - !ruby/object:Gem::Version
85
96
  version: '0'
86
- segments:
87
- - 0
88
- hash: -101513963914939075
97
+ none: false
89
98
  requirements: []
90
99
  rubyforge_project:
91
- rubygems_version: 1.8.11
100
+ rubygems_version: 1.8.23
92
101
  signing_key:
93
102
  specification_version: 3
94
103
  summary: Rails Date formatting and parsing with full parity between date.to_s.and