lazier 3.5.7 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis-gemfile +5 -4
- data/.travis.yml +2 -2
- data/CHANGELOG.md +65 -8
- data/Gemfile +9 -8
- data/README.md +4 -0
- data/doc/Lazier.html +178 -110
- data/doc/Lazier/Boolean.html +7 -7
- data/doc/Lazier/Configuration.html +24 -50
- data/doc/Lazier/DateTime.html +50 -305
- data/doc/Lazier/DateTime/ClassMethods.html +116 -806
- data/doc/Lazier/Exceptions.html +2 -2
- data/doc/Lazier/Exceptions/Debug.html +1 -1
- data/doc/Lazier/Exceptions/MissingTranslation.html +18 -14
- data/doc/Lazier/Exceptions/TranslationExceptionHandler.html +213 -0
- data/doc/Lazier/Hash.html +19 -155
- data/doc/Lazier/I18n.html +1735 -230
- data/doc/Lazier/Math.html +1 -1
- data/doc/Lazier/Math/ClassMethods.html +13 -13
- data/doc/Lazier/Object.html +353 -339
- data/doc/Lazier/Pathname.html +4 -4
- data/doc/Lazier/Settings.html +150 -304
- data/doc/Lazier/String.html +39 -199
- data/doc/Lazier/TimeZone.html +244 -746
- data/doc/Lazier/TimeZone/ClassMethods.html +109 -127
- data/doc/Lazier/Version.html +4 -4
- data/doc/_index.html +15 -15
- data/doc/class_list.html +1 -1
- data/doc/file.README.html +5 -1
- data/doc/index.html +5 -1
- data/doc/method_list.html +97 -169
- data/doc/top-level-namespace.html +1 -1
- data/lazier.gemspec +9 -6
- data/lib/lazier.rb +41 -50
- data/lib/lazier/boolean.rb +0 -1
- data/lib/lazier/configuration.rb +26 -28
- data/lib/lazier/datetime.rb +33 -127
- data/lib/lazier/exceptions.rb +14 -6
- data/lib/lazier/hash.rb +7 -15
- data/lib/lazier/i18n.rb +130 -48
- data/lib/lazier/math.rb +6 -7
- data/lib/lazier/object.rb +79 -97
- data/lib/lazier/pathname.rb +0 -1
- data/lib/lazier/settings.rb +12 -25
- data/lib/lazier/string.rb +17 -38
- data/lib/lazier/timezone.rb +168 -164
- data/lib/lazier/version.rb +3 -4
- data/locales/en.yml +52 -51
- data/locales/it.yml +51 -50
- data/spec/coverage_helper.rb +0 -1
- data/spec/lazier/boolean_spec.rb +2 -3
- data/spec/lazier/configuration_spec.rb +3 -5
- data/spec/lazier/datetime_spec.rb +34 -95
- data/spec/lazier/exceptions_spec.rb +25 -0
- data/spec/lazier/hash_spec.rb +0 -21
- data/spec/lazier/i18n_spec.rb +135 -51
- data/spec/lazier/math_spec.rb +0 -1
- data/spec/lazier/object_spec.rb +105 -100
- data/spec/lazier/pathname_spec.rb +0 -1
- data/spec/lazier/settings_spec.rb +25 -28
- data/spec/lazier/string_spec.rb +7 -20
- data/spec/lazier/timezone_spec.rb +101 -87
- data/spec/lazier_spec.rb +25 -8
- data/spec/spec_helper.rb +3 -2
- metadata +15 -44
- data/doc/Lazier/Localizer.html +0 -545
- data/lib/lazier/localizer.rb +0 -41
- data/spec/lazier/localizer_spec.rb +0 -45
data/lib/lazier/pathname.rb
CHANGED
data/lib/lazier/settings.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
#
|
3
2
|
# This file is part of the lazier gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
|
4
3
|
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
@@ -18,12 +17,7 @@ module Lazier
|
|
18
17
|
# @attribute [r] i18n
|
19
18
|
# @return [R18n::Translation] The translation object.
|
20
19
|
class Settings
|
21
|
-
attr_reader :format_number
|
22
|
-
attr_reader :boolean_names
|
23
|
-
attr_reader :date_names
|
24
|
-
attr_reader :date_formats
|
25
|
-
|
26
|
-
include Lazier::I18n
|
20
|
+
attr_reader :format_number, :boolean_names, :date_names, :date_formats, :i18n
|
27
21
|
|
28
22
|
# Returns the singleton instance of the settings.
|
29
23
|
#
|
@@ -31,12 +25,12 @@ module Lazier
|
|
31
25
|
# @return [Settings] The singleton instance of the settings.
|
32
26
|
def self.instance(force = false)
|
33
27
|
@instance = nil if force
|
34
|
-
@instance ||=
|
28
|
+
@instance ||= new
|
35
29
|
end
|
36
30
|
|
37
31
|
# Initializes a new settings object.
|
38
32
|
def initialize
|
39
|
-
|
33
|
+
@i18n = Lazier::I18n.instance
|
40
34
|
setup
|
41
35
|
end
|
42
36
|
|
@@ -48,15 +42,6 @@ module Lazier
|
|
48
42
|
setup_date_names
|
49
43
|
end
|
50
44
|
|
51
|
-
# Set the current locale for messages.
|
52
|
-
#
|
53
|
-
# @param locale [String] The new locale. Default is the current system locale.
|
54
|
-
# @return [R18n::Translation] The new translation object.
|
55
|
-
def i18n=(locale)
|
56
|
-
super(locale)
|
57
|
-
setup
|
58
|
-
end
|
59
|
-
|
60
45
|
# Setups formatters for a number.
|
61
46
|
# @see Object#format_number
|
62
47
|
#
|
@@ -65,7 +50,7 @@ module Lazier
|
|
65
50
|
# @param add_string [String] The string to append to the number.
|
66
51
|
# @param k_separator [String] The string to use as thousands separator.
|
67
52
|
# @return [Hash] The new formatters.
|
68
|
-
def setup_format_number(precision
|
53
|
+
def setup_format_number(precision: 2, decimal_separator: ".", add_string: nil, k_separator: ",")
|
69
54
|
@format_number = ::HashWithIndifferentAccess.new(
|
70
55
|
precision: precision, decimal_separator: decimal_separator, add_string: add_string, k_separator: k_separator
|
71
56
|
)
|
@@ -77,8 +62,9 @@ module Lazier
|
|
77
62
|
# @param true_name [String] The string representation of `true`. Defaults to `Yes`.
|
78
63
|
# @param false_name [String] The string representation of `false`. Defaults to `No`.
|
79
64
|
# @return [Hash] The new representations.
|
80
|
-
def setup_boolean_names(true_name
|
81
|
-
|
65
|
+
def setup_boolean_names(true_name: nil, false_name: nil)
|
66
|
+
names = i18n.translate("boolean")
|
67
|
+
@boolean_names = {true => true_name || names[0], false => false_name || names[1]}
|
82
68
|
end
|
83
69
|
|
84
70
|
# Setups custom formats for dates and times.
|
@@ -90,7 +76,8 @@ module Lazier
|
|
90
76
|
def setup_date_formats(formats = nil, replace = false)
|
91
77
|
@date_formats = HashWithIndifferentAccess.new if replace || !@date_formats
|
92
78
|
|
93
|
-
|
79
|
+
formats = {ct_date: "%Y-%m-%d", ct_time: "%H:%M:%S", ct_date_time: "%F %T", ct_iso_8601: "%FT%T%z" } unless formats.is_a?(::Hash)
|
80
|
+
@date_formats.merge!(formats)
|
94
81
|
::Time::DATE_FORMATS.merge!(@date_formats)
|
95
82
|
|
96
83
|
@date_formats
|
@@ -106,15 +93,15 @@ module Lazier
|
|
106
93
|
# @param long_days [Array] The string representation of days.
|
107
94
|
# @param short_days [Array] The abbreviated string representation of days.
|
108
95
|
# @return [Hash] The new representations.
|
109
|
-
def setup_date_names(long_months
|
110
|
-
definitions = i18n.date
|
96
|
+
def setup_date_names(long_months: nil, short_months: nil, long_days: nil, short_days: nil)
|
97
|
+
definitions = i18n.translate("date").ensure_access(:dotted)
|
111
98
|
|
112
99
|
@date_names = {
|
113
100
|
long_months: long_months.ensure(definitions.long_months),
|
114
101
|
short_months: short_months.ensure(definitions.short_months),
|
115
102
|
long_days: long_days.ensure(definitions.long_days),
|
116
103
|
short_days: short_days.ensure(definitions.short_days)
|
117
|
-
}.
|
104
|
+
}.ensure_access(:indifferent, :dotted)
|
118
105
|
end
|
119
106
|
end
|
120
107
|
end
|
data/lib/lazier/string.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
#
|
3
2
|
# This file is part of the lazier gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
|
4
3
|
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
@@ -9,18 +8,6 @@ module Lazier
|
|
9
8
|
module String
|
10
9
|
extend ::ActiveSupport::Concern
|
11
10
|
|
12
|
-
# Removes accents from the string, normalizing to the normal letter.
|
13
|
-
#
|
14
|
-
# ```ruby
|
15
|
-
# "èòàù".remove_accents
|
16
|
-
# # => "eoau"
|
17
|
-
# ```
|
18
|
-
#
|
19
|
-
# @return The string with all accents removed.
|
20
|
-
def remove_accents
|
21
|
-
silence_warnings { mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n, "").to_s }
|
22
|
-
end
|
23
|
-
|
24
11
|
# Makes sure the string only contains valid UTF-8 sequences.
|
25
12
|
#
|
26
13
|
# @param replacement [String] The string to use to replace invalid sequences.
|
@@ -30,27 +17,6 @@ module Lazier
|
|
30
17
|
encode("utf-16", invalid: :replace, undef: :replace, replace: replacement).encode("utf-8")
|
31
18
|
end
|
32
19
|
|
33
|
-
# Returns the tagged version of a string.
|
34
|
-
#
|
35
|
-
# The string is downcased and spaces are substituted with `-`.
|
36
|
-
#
|
37
|
-
# ```ruby
|
38
|
-
# "ABC cde".untitleize
|
39
|
-
# # => "abc-cde"
|
40
|
-
# ```
|
41
|
-
#
|
42
|
-
# @return [String] The untitleized version of the string.
|
43
|
-
def untitleize
|
44
|
-
downcase.gsub(" ", "-")
|
45
|
-
end
|
46
|
-
|
47
|
-
# Returns the string with all `&` replaced with `&`.
|
48
|
-
#
|
49
|
-
# @return [String] The string with all `&` replaced with `&`.
|
50
|
-
def replace_ampersands
|
51
|
-
gsub(/&(\S+);/, "&\\1;")
|
52
|
-
end
|
53
|
-
|
54
20
|
# Returns the string itself for use in form helpers.
|
55
21
|
#
|
56
22
|
# @return [String] The string itself.
|
@@ -62,15 +28,28 @@ module Lazier
|
|
62
28
|
#
|
63
29
|
# @param no_blanks [Boolean] If filter out blank tokens.
|
64
30
|
# @param strip [Boolean] If strip single tokens.
|
65
|
-
# @param
|
31
|
+
# @param no_duplicates [Boolean] If return uniques elements.
|
66
32
|
# @param pattern [String|Regexp] The pattern to use.
|
33
|
+
# @param presence_method [Symbol] The method to use to check if a token is present or not.
|
67
34
|
# @return [Array] An array of tokens.
|
68
|
-
def
|
35
|
+
def tokenize(no_blanks: true, strip: true, no_duplicates: false, pattern: /\s*,\s*/, presence_method: :present?)
|
69
36
|
rv = split(pattern)
|
70
37
|
rv.map!(&:strip) if strip
|
71
|
-
rv.select!(
|
72
|
-
rv.uniq! if
|
38
|
+
rv.select!(&presence_method) if no_blanks
|
39
|
+
rv.uniq! if no_duplicates
|
73
40
|
rv
|
74
41
|
end
|
42
|
+
|
43
|
+
# Removes accents from the string, normalizing to the normal letter.
|
44
|
+
#
|
45
|
+
# ```ruby
|
46
|
+
# "èòàù".remove_accents
|
47
|
+
# # => "eoau"
|
48
|
+
# ```
|
49
|
+
#
|
50
|
+
# @return The string with all accents removed.
|
51
|
+
def remove_accents
|
52
|
+
::I18n.transliterate(self)
|
53
|
+
end
|
75
54
|
end
|
76
55
|
end
|
data/lib/lazier/timezone.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
#
|
3
2
|
# This file is part of the lazier gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
|
4
3
|
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
@@ -9,14 +8,28 @@ module Lazier
|
|
9
8
|
module TimeZone
|
10
9
|
extend ::ActiveSupport::Concern
|
11
10
|
|
11
|
+
# Pattern for a parameterized timezone.
|
12
|
+
ALREADY_PARAMETERIZED = /^[+-]\d{4}@[a-z-]+/
|
13
|
+
|
14
|
+
# Pattern for a unparameterized timezone.
|
15
|
+
PARAMETERIZER = /^(
|
16
|
+
\(
|
17
|
+
[a-z]+ # UTC Label
|
18
|
+
(?<offset>([+-])(\d{2})(:?)(\d{2}))
|
19
|
+
\)
|
20
|
+
\s
|
21
|
+
(?<label>.+)
|
22
|
+
)$/xi
|
23
|
+
|
12
24
|
# General methods.
|
13
25
|
module ClassMethods
|
26
|
+
# Expression to parameterize a zone
|
14
27
|
# Returns an offset in rational value.
|
15
28
|
#
|
16
29
|
# @param offset [Fixnum] The offset to convert.
|
17
30
|
# @return [Rational] The converted offset.
|
18
31
|
def rationalize_offset(offset)
|
19
|
-
::TZInfo::OffsetRationals.rational_for_offset(offset
|
32
|
+
::TZInfo::OffsetRationals.rational_for_offset(offset)
|
20
33
|
end
|
21
34
|
|
22
35
|
# Returns a +HH:MM formatted representation of the offset.
|
@@ -31,37 +44,30 @@ module Lazier
|
|
31
44
|
# Find a zone by its name.
|
32
45
|
#
|
33
46
|
# @param name [String] The zone name.
|
34
|
-
# @param dst_label [String] Label for the DST indication. Defaults to `(DST)`.
|
47
|
+
# @param dst_label [String] Label for the DST indication. Defaults to ` (DST)`.
|
35
48
|
# @return [TimeZone] A timezone or `nil` if no zone was found.
|
36
|
-
def find(name, dst_label =
|
37
|
-
|
38
|
-
::ActiveSupport::TimeZone.all.each do |zone|
|
39
|
-
zone.aliases.each do |zone_alias|
|
40
|
-
if [zone.to_str(zone_alias), zone.to_str_with_dst(dst_label, nil, zone_alias)].include?(name)
|
41
|
-
zone.current_alias = zone_alias
|
42
|
-
throw(:zone, zone)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
nil
|
48
|
-
end
|
49
|
+
def find(name, dst_label = " (DST)")
|
50
|
+
list(true, dst_label: dst_label, as_hash: true)[name]
|
49
51
|
end
|
50
52
|
|
51
53
|
# Returns a list of names of all timezones.
|
52
54
|
#
|
53
55
|
# @param with_dst [Boolean] If include DST version of the zones.
|
54
|
-
# @param
|
55
|
-
# @
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
56
|
+
# @param parameterized [Boolean] If parameterize zones.
|
57
|
+
# @param dst_label [String] Label for the DST indication. Defaults to ` (DST)`.
|
58
|
+
# @param as_hash [Hash] If return an hash.
|
59
|
+
# @return [Array|Hash] A list of names of timezones or a hash with labels and timezones as keys.
|
60
|
+
def list(with_dst = true, dst_label: " (DST)", parameterized: false, sort_by_name: true, as_hash: false)
|
61
|
+
dst_label = nil unless with_dst
|
62
|
+
key = [dst_label, sort_by_name, as_hash, parameterized].join(":")
|
63
|
+
@zones_names ||= {}
|
64
|
+
|
65
|
+
unless @zones_names[key]
|
66
|
+
all = ::ActiveSupport::TimeZone.all
|
67
|
+
@zones_names[key] = send("finalize_list_as_#{as_hash ? "hash" : "list"}", all, dst_label, parameterized, sort_by_name)
|
68
|
+
end
|
63
69
|
|
64
|
-
@zones_names[
|
70
|
+
@zones_names[key]
|
65
71
|
end
|
66
72
|
|
67
73
|
# Returns a string representation of a timezone.
|
@@ -70,17 +76,17 @@ module Lazier
|
|
70
76
|
# DateTime.parameterize_zone(ActiveSupport::TimeZone["Pacific Time (US & Canada)"])
|
71
77
|
# # => "-0800@pacific-time-us-canada"
|
72
78
|
# ```
|
73
|
-
# @param tz [TimeZone] The zone to represent.
|
79
|
+
# @param tz [TimeZone|String] The zone to represent.
|
74
80
|
# @param with_offset [Boolean] If to include offset into the representation.
|
75
81
|
# @return [String] A string representation which can be used for searches.
|
76
|
-
def
|
77
|
-
tz = tz.
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
82
|
+
def parameterize(tz, with_offset = true)
|
83
|
+
tz = tz.to_str unless tz.is_a?(::String)
|
84
|
+
|
85
|
+
if tz =~ ::Lazier::TimeZone::ALREADY_PARAMETERIZED
|
86
|
+
tz
|
87
|
+
elsif tz =~ ::Lazier::TimeZone::PARAMETERIZER
|
88
|
+
mo = $LAST_MATCH_INFO
|
89
|
+
[(with_offset ? mo[:offset].gsub(":", "") : nil), mo[:label].parameterize].compact.join("@")
|
84
90
|
else
|
85
91
|
tz.parameterize
|
86
92
|
end
|
@@ -90,18 +96,11 @@ module Lazier
|
|
90
96
|
# @see DateTime#parameterize_zone
|
91
97
|
#
|
92
98
|
# @param tz [String] The zone to unparameterize.
|
93
|
-
# @param as_string [Boolean] If return just the zone name.
|
94
99
|
# @param dst_label [String] Label for the DST indication. Defaults to `(DST)`.
|
95
|
-
# @return [
|
96
|
-
def
|
97
|
-
tz =
|
98
|
-
|
99
|
-
|
100
|
-
if rv
|
101
|
-
as_string ? rv : find(rv, dst_label)
|
102
|
-
else
|
103
|
-
nil
|
104
|
-
end
|
100
|
+
# @return [TimeZone] The found timezone or `nil` if the zone is not valid.
|
101
|
+
def unparameterize(tz, dst_label = " (DST)")
|
102
|
+
tz = parameterize(tz)
|
103
|
+
list(true, dst_label: dst_label, parameterized: true, as_hash: true)[tz]
|
105
104
|
end
|
106
105
|
|
107
106
|
# Compares two timezones. They are sorted by the location name.
|
@@ -117,31 +116,35 @@ module Lazier
|
|
117
116
|
|
118
117
|
private
|
119
118
|
|
120
|
-
#
|
121
|
-
|
122
|
-
# @param zone [ActiveSupport::TimeZone] The zone.
|
123
|
-
# @param dst_label [String] Label for the DST indication. Defaults to `(DST)`.
|
124
|
-
def fetch_aliases(zone, dst_label = "(DST)")
|
125
|
-
matcher = /(#{Regexp.quote(dst_label)})$/
|
126
|
-
|
119
|
+
# :nodoc:
|
120
|
+
def fetch_aliases(zone, dst_label = "(DST)", parameterized = false)
|
127
121
|
zone.aliases.map { |zone_alias|
|
128
|
-
[
|
129
|
-
|
122
|
+
[
|
123
|
+
zone.to_str(false, label: zone_alias, parameterized: parameterized),
|
124
|
+
(zone.uses_dst? && dst_label) ? zone.to_str(true, label: zone_alias, dst_label: dst_label, parameterized: parameterized) : nil
|
125
|
+
]
|
126
|
+
}.flatten.uniq.compact
|
130
127
|
end
|
131
128
|
|
132
|
-
#
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
129
|
+
# :nodoc:
|
130
|
+
def finalize_list_as_list(all, dst_label, parameterized, sort_by_name)
|
131
|
+
rv = all.map { |zone|
|
132
|
+
fetch_aliases(zone, dst_label, parameterized)
|
133
|
+
}.flatten.uniq
|
134
|
+
|
135
|
+
sort_by_name ? rv.sort { |a, b| ::ActiveSupport::TimeZone.compare(a, b) } : rv
|
136
|
+
end
|
137
|
+
|
138
|
+
# :nodoc:
|
139
|
+
def finalize_list_as_hash(all, dst_label, parameterized, sort_by_name)
|
140
|
+
rv = all.reduce({}) { |accu, zone|
|
141
|
+
accu.merge(fetch_aliases(zone, dst_label, parameterized).reduce({}) { |a, e|
|
142
|
+
a[e] = zone
|
143
|
+
a
|
144
|
+
})
|
145
|
+
}
|
146
|
+
|
147
|
+
sort_by_name ? ::Hash[rv.sort { |a, b| ::ActiveSupport::TimeZone.compare(a[0], b[0]) }] : rv
|
145
148
|
end
|
146
149
|
end
|
147
150
|
|
@@ -158,150 +161,124 @@ module Lazier
|
|
158
161
|
# @param date [DateTime] The date to consider. Defaults to now.
|
159
162
|
# @return [Fixnum|Rational] The offset of this timezone.
|
160
163
|
def current_offset(rational = false, date = nil)
|
161
|
-
date
|
162
|
-
|
163
|
-
rational ? self.class.rationalize_offset(rv) : rv
|
164
|
+
date = (date || ::DateTime.current).in_time_zone
|
165
|
+
offset(rational: rational, dst: date.dst?, year: date.year)
|
164
166
|
end
|
165
167
|
|
166
168
|
# Returns the current alias for this timezone.
|
167
169
|
#
|
168
170
|
# @return [String] The current alias or the first alias of the current timezone.
|
169
171
|
def current_alias
|
170
|
-
|
171
|
-
@current_alias
|
172
|
-
else
|
173
|
-
identifier = tzinfo.identifier
|
172
|
+
identifier = name
|
174
173
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
end
|
179
|
-
|
180
|
-
aliases.first
|
174
|
+
catch(:alias) do
|
175
|
+
aliases.each do |a|
|
176
|
+
throw(:alias, a) if a == identifier
|
181
177
|
end
|
178
|
+
|
179
|
+
aliases.first
|
182
180
|
end
|
183
181
|
end
|
184
182
|
|
185
|
-
#
|
183
|
+
# Returns the current name.
|
186
184
|
#
|
187
|
-
# @param
|
188
|
-
|
189
|
-
|
185
|
+
# @param dst [Boolean] If to return the name with DST indication.
|
186
|
+
# @param dst_label [String] Label for the DST indication. Defaults to ` (DST)`.
|
187
|
+
# @param year [Fixnum] The year to which refer to. Defaults to the current year. *Only required when `dst` is true*.
|
188
|
+
# @return [String] The name for the zone.
|
189
|
+
def current_name(dst = false, dst_label: " (DST)", year: nil)
|
190
|
+
year ||= Date.current.year
|
191
|
+
rv = current_alias
|
192
|
+
rv += dst_label if dst && uses_dst?(year)
|
193
|
+
rv
|
190
194
|
end
|
191
195
|
|
192
196
|
# Returns the standard offset for this timezone.
|
193
197
|
#
|
194
198
|
# @param rational [Boolean] If to return the offset as a Rational.
|
195
|
-
# @
|
196
|
-
def offset(rational = false)
|
197
|
-
rational ? self.class.rationalize_offset(utc_offset) : utc_offset
|
198
|
-
end
|
199
|
-
|
200
|
-
# Gets a period for this timezone when the Daylight Saving Time (DST) is active (it takes care of different hemispheres).
|
201
|
-
#
|
199
|
+
# @param dst [Boolean] If to return the offset when the DST is active.
|
202
200
|
# @param year [Fixnum] The year to which refer to. Defaults to the current year.
|
203
|
-
# @return [
|
204
|
-
def
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
201
|
+
# @return [Fixnum|Rational] The offset of this timezone.
|
202
|
+
def offset(rational: false, dst: false, year: nil)
|
203
|
+
rv =
|
204
|
+
if dst
|
205
|
+
period = dst_period(year)
|
206
|
+
period ? period.utc_total_offset : 0
|
207
|
+
else
|
208
|
+
utc_offset
|
209
|
+
end
|
209
210
|
|
210
|
-
|
211
|
-
period = period_for_utc(southern_summer) unless period.dst?
|
212
|
-
period.dst? ? period : nil
|
211
|
+
rational ? self.class.rationalize_offset(rv) : rv
|
213
212
|
end
|
214
213
|
|
215
214
|
# Checks if the timezone uses Daylight Saving Time (DST) for that date or year.
|
216
215
|
#
|
217
|
-
# @param reference [
|
216
|
+
# @param reference [Date|DateTime] The date or year to check. Defaults to the current year.
|
218
217
|
# @return [Boolean] `true` if the zone uses DST for that date or year, `false` otherwise.
|
219
218
|
def uses_dst?(reference = nil)
|
220
|
-
if reference.
|
221
|
-
|
219
|
+
if reference.is_a?(Date) || reference.is_a?(DateTime) || reference.is_a?(Time)
|
220
|
+
period_for_utc(reference).dst?
|
222
221
|
else
|
223
|
-
dst_period(reference)
|
222
|
+
dst_period(reference)
|
224
223
|
end
|
225
224
|
end
|
226
225
|
|
227
|
-
#
|
226
|
+
# Gets a period for this timezone when the Daylight Saving Time (DST) is active (it takes care of different hemispheres).
|
228
227
|
#
|
229
|
-
# @param rational [Boolean] If to return the offset as a Rational.
|
230
228
|
# @param year [Fixnum] The year to which refer to. Defaults to the current year.
|
231
|
-
# @return [
|
232
|
-
def
|
233
|
-
|
229
|
+
# @return [TimezonePeriod] A period when the Daylight Saving Time (DST) is active or `nil` if the timezone doesn't use DST for that year.
|
230
|
+
def dst_period(year = nil)
|
231
|
+
year ||= ::Date.current.year
|
232
|
+
|
233
|
+
period = period_for_utc(::DateTime.civil(year, 7, 15, 12).utc) # Summer for the northern hemisphere
|
234
|
+
period = period_for_utc(::DateTime.civil(year, 1, 15, 12).utc) unless period.dst? # Summer for the southern hemisphere
|
235
|
+
period.dst? ? period : nil
|
236
|
+
rescue
|
237
|
+
nil
|
234
238
|
end
|
235
239
|
|
236
|
-
#
|
240
|
+
# Return the correction applied to the standard offset the timezone when the Daylight Saving Time (DST) is active.
|
237
241
|
#
|
238
242
|
# @param rational [Boolean] If to return the offset as a Rational.
|
239
243
|
# @param year [Fixnum] The year to which refer to. Defaults to the current year.
|
240
|
-
# @
|
241
|
-
|
242
|
-
|
243
|
-
period = dst_period(year)
|
244
|
-
rv = period ? period.send(method) : 0
|
244
|
+
# @return [Fixnum|Rational] The correction for dst.
|
245
|
+
def dst_correction(rational = false, year = nil)
|
246
|
+
rv = dst_offset(year, :std_offset)
|
245
247
|
rational ? self.class.rationalize_offset(rv) : rv
|
246
248
|
end
|
247
249
|
|
248
|
-
#
|
250
|
+
# Formats this zone as a string.
|
249
251
|
#
|
250
|
-
# @param
|
251
|
-
# @param
|
252
|
-
# @param name [String] The name to use for this zone. Defaults to the zone name.
|
253
|
-
# @return [String] The name for the zone with DST or `nil`, if the timezone doesn't use DST for that year.
|
254
|
-
def dst_name(dst_label = nil, year = nil, name = nil)
|
255
|
-
uses_dst?(year) ? "#{name || self.name} #{dst_label || "(DST)"}" : nil
|
256
|
-
end
|
257
|
-
|
258
|
-
# Returns the name for this zone with Daylight Saving Time (DST) active.
|
252
|
+
# @param dst [Boolean] If to represent with (DST) active.
|
253
|
+
# @param args [Hash] Parameters for the formatting:
|
259
254
|
#
|
260
|
-
#
|
261
|
-
#
|
262
|
-
#
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
#
|
255
|
+
# * **label** (`String`): The label to use. Default to the current alias.
|
256
|
+
# * **dst_label** (`String`): Label for the DST indication. Defaults to ` (DST)`.
|
257
|
+
# * **utc_label** (`String`): Label for the UTC name. Defaults to `GMT`. *Only used when `parameterized` is `false`.
|
258
|
+
# * **year** (`Fixnum`): The year to which refer to. Defaults to the current year.
|
259
|
+
# * **parameterized** (`Boolean`): If to represent as parameterized.
|
260
|
+
# * **with_offset** (`Boolean`): If to include offset into the representation. *Only used when `parameterized` is `true`.
|
261
|
+
# * **offset_position** (`Symbol`): Where to put the offset. Valid values are `:begin` or `:end`. *Only used when `parameterized` is `false`.
|
262
|
+
# * **colon** (`Boolean`): If include a colon in the offset. *Only used when `parameterized` is `false`.
|
268
263
|
#
|
269
|
-
# @
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
def to_str_with_dst(dst_label = nil, year = nil, name = nil)
|
274
|
-
uses_dst?(year) ? "(GMT#{self.class.seconds_to_utc_offset(dst_period(year).utc_total_offset)}) #{name || current_alias} #{dst_label || "(DST)"}" : nil
|
275
|
-
end
|
264
|
+
# @return [String] The string representation for this zone.
|
265
|
+
def to_str(dst = false, **args)
|
266
|
+
# PI: Ignore reek on this.
|
267
|
+
label, dst_label, utc_label, year, parameterized, with_offset, colon, offset_position = prepare_to_str_arguments(args)
|
276
268
|
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
def to_str_parameterized(with_offset = true, name = nil)
|
283
|
-
::ActiveSupport::TimeZone.parameterize_zone(name || to_str, with_offset)
|
284
|
-
end
|
269
|
+
if parameterized
|
270
|
+
self.class.parameterize(to_str(dst, label: label, dst_label: dst_label, utc_label: utc_label, year: year, parameterized: false), with_offset)
|
271
|
+
else
|
272
|
+
offset_label = self.class.seconds_to_utc_offset(offset(rational: false, dst: dst, year: year), colon)
|
273
|
+
dst_label = "" unless dst
|
285
274
|
|
286
|
-
|
287
|
-
|
288
|
-
# @param dst_label [String] Label for the DST indication. Defaults to `(DST)`.
|
289
|
-
# @param year [Fixnum] The year to which refer to. Defaults to the current year.
|
290
|
-
# @param name [String] The name to use for this zone. Defaults to the zone name.
|
291
|
-
# @return [String] The parameterized string representation for this zone with DST or `nil`, if the timezone doesn't use DST for that year.
|
292
|
-
def to_str_with_dst_parameterized(dst_label = nil, year = nil, name = nil)
|
293
|
-
rv = to_str_with_dst(dst_label, year, name)
|
294
|
-
rv ? ::ActiveSupport::TimeZone.parameterize_zone(rv) : nil
|
275
|
+
to_str_unparameterized(dst_label, label, offset_label, offset_position, utc_label, with_offset)
|
276
|
+
end
|
295
277
|
end
|
296
278
|
|
297
279
|
private
|
298
280
|
|
299
|
-
#
|
300
|
-
#
|
301
|
-
# @param name [String] The zone name.
|
302
|
-
# @param zone [String] The zone.
|
303
|
-
# @param reference [String] The main name for the zone.
|
304
|
-
# @return [String|nil] The formatted alias.
|
281
|
+
# :nodoc
|
305
282
|
def format_alias(name, zone, reference)
|
306
283
|
if zone.gsub("_", " ") == reference
|
307
284
|
["International Date Line West", "UTC"].include?(name) || name.include?("(US & Canada)") ? name : reference.gsub(/\/.*/, "/#{name}")
|
@@ -309,5 +286,32 @@ module Lazier
|
|
309
286
|
nil
|
310
287
|
end
|
311
288
|
end
|
289
|
+
|
290
|
+
# :nodoc:
|
291
|
+
def dst_offset(year, method)
|
292
|
+
period = dst_period(year)
|
293
|
+
period ? period.send(method) : 0
|
294
|
+
end
|
295
|
+
|
296
|
+
# :nodoc:
|
297
|
+
def prepare_to_str_arguments(args)
|
298
|
+
args = args.reverse_merge(
|
299
|
+
label: current_alias, dst_label: " (DST)", utc_label: "GMT", year: nil, parameterized: false,
|
300
|
+
with_offset: true, colon: true, offset_position: :begin
|
301
|
+
).symbolize_keys
|
302
|
+
|
303
|
+
[:label, :dst_label, :utc_label, :year, :parameterized, :with_offset, :colon, :offset_position].map { |e| args[e] }
|
304
|
+
end
|
305
|
+
|
306
|
+
# :nodoc:
|
307
|
+
def to_str_unparameterized(dst_label, label, offset_label, offset_position, utc_label, with_offset)
|
308
|
+
if !with_offset
|
309
|
+
format("%s%s", label, dst_label)
|
310
|
+
elsif offset_position != :end
|
311
|
+
format("(%s%s) %s%s", utc_label, offset_label, label, dst_label)
|
312
|
+
else
|
313
|
+
format("%s%s (%s%s)", label, dst_label, utc_label, offset_label)
|
314
|
+
end
|
315
|
+
end
|
312
316
|
end
|
313
317
|
end
|