timezone_field 1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/timezone_field.rb +51 -0
  2. metadata +78 -0
@@ -0,0 +1,51 @@
1
+ require 'active_record'
2
+ require 'active_support'
3
+
4
+ module TimezoneField
5
+ extend ActiveSupport::Concern
6
+
7
+ class ZoneValidator < ActiveModel::Validator
8
+ def validate(record)
9
+ record.class.timezone_fields.each do |tz_field|
10
+ value = record.send(:read_attribute, tz_field)
11
+ if value.present?
12
+ record.errors[tz_field.to_sym] << 'Unrecognized timezone' if ActiveSupport::TimeZone[value].nil?
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ module ClassMethods
19
+ def has_timezone_field(field_name)
20
+ self.timezone_fields ||= []
21
+ self.timezone_fields << field_name
22
+ define_timezone_accessors(field_name)
23
+ end
24
+
25
+ def define_timezone_accessors(field_name)
26
+ define_method(:"#{field_name}") do
27
+ mapping = ActiveSupport::TimeZone::MAPPING
28
+ zone_str = read_attribute(field_name)
29
+ if mapping.has_key?(zone_str)
30
+ rails_zone_identifier = zone_str
31
+ else
32
+ rails_zone_identifier = mapping.invert[zone_str] || Time.zone.name
33
+ end
34
+ ActiveSupport::TimeZone[rails_zone_identifier]
35
+ end
36
+ define_method(:"#{field_name}=") do |tz|
37
+ zone = tz && ActiveSupport::TimeZone[tz]
38
+ if zone
39
+ write_attribute(field_name, zone.tzinfo.name)
40
+ else
41
+ write_attribute(field_name, tz) # This will produce a validation error when you try to save
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ included do
48
+ class_attribute :timezone_fields
49
+ validates_with ZoneValidator
50
+ end
51
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: timezone_field
3
+ version: !ruby/object:Gem::Version
4
+ version: '1.0'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Victor Lin
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-08-21 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: active_record
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: active_support
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: Stores timezones as standard TZInfo identifiers and handles conversion
47
+ to/from Rails-friendly timezones
48
+ email: victor@wellnessfx.com
49
+ executables: []
50
+ extensions: []
51
+ extra_rdoc_files: []
52
+ files:
53
+ - lib/timezone_field.rb
54
+ homepage: ''
55
+ licenses: []
56
+ post_install_message:
57
+ rdoc_options: []
58
+ require_paths:
59
+ - lib
60
+ required_ruby_version: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ! '>='
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ requirements: []
73
+ rubyforge_project:
74
+ rubygems_version: 1.8.24
75
+ signing_key:
76
+ specification_version: 3
77
+ summary: Rails-friendly timezone field
78
+ test_files: []