dtg 4.0.1 → 5.0.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.
- checksums.yaml +4 -4
- data/.coveralls.yml +2 -0
- data/.gitignore +39 -0
- data/.inch.yml +6 -0
- data/.prettierignore +49 -0
- data/.rspec +3 -0
- data/.ruby-version +1 -0
- data/.travis.yml +20 -0
- data/CHANGELOG.md +0 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +0 -42
- data/Gemfile.lock +70 -0
- data/LICENSE +21 -0
- data/README.md +225 -0
- data/Rakefile +11 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/dtg.gemspec +46 -27
- data/dtg_zones.png +0 -0
- data/lib/dtg.rb +20 -7
- data/lib/dtg/active_support/time_with_zone_ext.rb +2 -2
- data/lib/dtg/date_time_ext.rb +3 -3
- data/lib/dtg/date_time_group.rb +54 -2
- data/lib/dtg/format.rb +59 -0
- data/lib/dtg/time_ext.rb +2 -2
- data/lib/dtg/version.rb +1 -1
- data/lib/dtg/zones.rb +2 -2
- data/spec/dtg/active_support/time_with_zone_ext_spec.rb +176 -0
- data/spec/dtg/date_time_ext_spec.rb +175 -0
- data/spec/dtg/date_time_group_spec.rb +73 -0
- data/spec/dtg/format_spec.rb +99 -0
- data/spec/dtg/time_ext_spec.rb +175 -0
- data/spec/{lib/dtg → dtg}/zones_spec.rb +29 -31
- data/spec/dtg_spec.rb +13 -0
- data/spec/spec_helper.rb +7 -94
- metadata +109 -18
- data/spec/lib/dtg/active_support/time_with_zone_ext_spec.rb +0 -169
- data/spec/lib/dtg/date_time_ext_spec.rb +0 -168
- data/spec/lib/dtg/date_time_group_spec.rb +0 -35
- data/spec/lib/dtg/time_ext_spec.rb +0 -168
- data/spec/lib/dtg_spec.rb +0 -9
data/Rakefile
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
|
4
|
+
RSpec::Core::RakeTask.new(:spec)
|
5
|
+
|
6
|
+
task default: :spec
|
7
|
+
|
8
|
+
desc 'pretty up the lib'
|
9
|
+
task :pretty do
|
10
|
+
exec('rbprettier --write lib/**/*.rb')
|
11
|
+
end
|
1
12
|
# desc "Explaining what the task does"
|
2
13
|
# task :dtg do
|
3
14
|
# # Task goes here
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "dtg"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
data/dtg.gemspec
CHANGED
@@ -1,47 +1,66 @@
|
|
1
1
|
# Ensure all of library added to gem
|
2
|
-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
4
|
|
4
5
|
# Maintain your gem's version:
|
5
|
-
require
|
6
|
+
require 'dtg/version'
|
6
7
|
|
7
|
-
# Describe your gem and declare its dependencies:
|
8
8
|
Gem::Specification.new do |spec|
|
9
|
-
spec.name
|
10
|
-
spec.version
|
11
|
-
spec.authors
|
12
|
-
spec.email
|
13
|
-
spec.homepage
|
14
|
-
spec.summary
|
15
|
-
spec.description =
|
9
|
+
spec.name = 'dtg'
|
10
|
+
spec.version = Dtg::VERSION
|
11
|
+
spec.authors = %w[SolarisFlare]
|
12
|
+
spec.email = %w[shadowbomb20@gmail.com]
|
13
|
+
spec.homepage = 'https://github.com/SolarisFlare/dtg/README.md'
|
14
|
+
spec.summary = 'DTG converts from a DateTime to a DTG'
|
15
|
+
spec.description =
|
16
|
+
'A DTG is a DateTimeGroup which is used in the military to save time. DTG
|
16
17
|
are saved in the format DDHHMML MMM YY, where D is day, H is hour, L is
|
17
18
|
letter, M is month, and Y is year. The Month is the 3 character
|
18
19
|
representation such as JAN for January, MAY for May, DEC for December and so
|
19
20
|
on. Year is only the last two digits of the year e.g. 2019 is just 19. The
|
20
21
|
letter is the zone code such as W for whiskey which is HST, Z for zulu which
|
21
|
-
is GMT, A-Z are the zones used.
|
22
|
-
spec.license
|
23
|
-
spec.required_rubygems_version = Gem::Requirement.new(">= 0") if spec.respond_to? \
|
24
|
-
:required_rubygems_version=
|
25
|
-
spec.files = Dir["Gemfile", "dtg.gemspec", "Rakefile", "lib/**/*"]
|
26
|
-
spec.test_files = Dir["spec/**/*"]
|
27
|
-
spec.rubygems_version = %q{1.6.2}
|
28
|
-
|
29
|
-
# Active support is necessary for ActiveSupport::TimeWithZone integration
|
30
|
-
spec.add_dependency "activesupport"
|
22
|
+
is GMT, A-Z are the zones used.'
|
23
|
+
spec.license = 'MIT'
|
31
24
|
|
32
25
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
33
26
|
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
34
27
|
if spec.respond_to?(:metadata)
|
35
|
-
spec.metadata[
|
28
|
+
spec.metadata['allowed_push_host'] = 'NOSERVER'
|
29
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
30
|
+
spec.metadata['source_code_uri'] = 'https://github.com/SolarisFlare/dtg'
|
31
|
+
spec.metadata['changelog_uri'] =
|
32
|
+
'https://github.com/SolarisFlare/dtg/CHANGELOG.md'
|
36
33
|
else
|
37
|
-
raise
|
38
|
-
|
34
|
+
raise 'RubyGems 2.0 or newer is required to protect against ' \
|
35
|
+
'public gem pushes.'
|
39
36
|
end
|
40
37
|
|
41
|
-
|
42
|
-
|
38
|
+
# Specify test files that do not belong added when building gem
|
39
|
+
spec.test_files = Dir['spec/**/*']
|
43
40
|
|
44
|
-
|
41
|
+
# Specify which files should be added to the gem when it is released.
|
42
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
43
|
+
spec.files =
|
44
|
+
Dir.chdir(File.expand_path('..', __FILE__)) do
|
45
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
46
|
+
f.match(%r{^(test|spec|features)/})
|
47
|
+
end
|
45
48
|
end
|
46
|
-
|
49
|
+
spec.bindir = 'exe'
|
50
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
51
|
+
spec.require_paths = %w[lib]
|
52
|
+
|
53
|
+
# Active support is necessary for ActiveSupport::TimeWithZone integration
|
54
|
+
spec.add_dependency 'activesupport'
|
55
|
+
|
56
|
+
# Bundler to manage gems ad versions
|
57
|
+
spec.add_development_dependency 'bundler', '~> 1.17'
|
58
|
+
# Rake to run tasks
|
59
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
60
|
+
# RSpec for testing suite
|
61
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
62
|
+
# Prettier for better formatting
|
63
|
+
spec.add_development_dependency 'prettier'
|
64
|
+
# Coveralls for test suite reporting
|
65
|
+
spec.add_development_dependency 'coveralls'
|
47
66
|
end
|
data/dtg_zones.png
ADDED
Binary file
|
data/lib/dtg.rb
CHANGED
@@ -1,12 +1,25 @@
|
|
1
|
-
|
2
|
-
require_relative
|
3
|
-
|
4
|
-
require_relative
|
5
|
-
|
6
|
-
require_relative
|
1
|
+
# DTG version
|
2
|
+
require_relative 'dtg/version'
|
3
|
+
# Base module which contains all functionality
|
4
|
+
require_relative 'dtg/date_time_group'
|
5
|
+
# Zone codes and their offsets
|
6
|
+
require_relative 'dtg/zones'
|
7
|
+
# Format of DTG data (for conversion purposes)
|
8
|
+
require_relative 'dtg/format'
|
9
|
+
# Extension of DTG into Time object for native compatability
|
10
|
+
require_relative 'dtg/time_ext'
|
11
|
+
# Extension of DTG into DateTime object for native compatability
|
12
|
+
require_relative 'dtg/date_time_ext'
|
13
|
+
# Extension of DTG into ActiveSupport::TimeWithZone object for native compatability
|
14
|
+
require_relative 'dtg/active_support/time_with_zone_ext'
|
7
15
|
|
16
|
+
# Base module: Debug if active by calling Dtg.dtg to also check your current running version
|
8
17
|
module Dtg
|
18
|
+
# Errors are nice
|
19
|
+
class Error < StandardError; end
|
20
|
+
|
21
|
+
# Announce DTG version and if incorporated properly into the application
|
9
22
|
def self.dtg
|
10
|
-
"DTG gem is active"
|
23
|
+
"DTG gem is active running version: #{VERSION}"
|
11
24
|
end
|
12
25
|
end
|
data/lib/dtg/date_time_ext.rb
CHANGED
data/lib/dtg/date_time_group.rb
CHANGED
@@ -1,15 +1,17 @@
|
|
1
|
-
require_relative
|
1
|
+
require_relative 'zones'
|
2
|
+
require_relative 'format'
|
2
3
|
|
3
4
|
module DateTimeGroup
|
4
5
|
# Zones module has timezones (UTC_Zones) as dtg listings
|
5
6
|
include Zones
|
7
|
+
include Format
|
6
8
|
|
7
9
|
# Convert the object to the proper zone and then format as dtg in zone
|
8
10
|
def to_dtg(zone = :z)
|
9
11
|
convert(zone).format(zone)
|
10
12
|
end
|
11
13
|
|
12
|
-
# DTG Test to determine if was injected properly into class
|
14
|
+
# DTG Test to determine if was injected properly into class for native use
|
13
15
|
def dtg
|
14
16
|
"DTG gem is natively integrated with this class: #{self.class}"
|
15
17
|
end
|
@@ -28,4 +30,54 @@ module DateTimeGroup
|
|
28
30
|
raise "Error: #{zone} is not a valid zone" unless UTC_ZONES.key?(key)
|
29
31
|
key == :j ? self.dup : self.in_time_zone(UTC_ZONES[key])
|
30
32
|
end
|
33
|
+
|
34
|
+
# Parse will strip the DTG into its different fields
|
35
|
+
def self.parse(dtg)
|
36
|
+
{
|
37
|
+
day: dtg[FORMAT[:day_range]],
|
38
|
+
hour: dtg[FORMAT[:hour_range]],
|
39
|
+
minute: dtg[FORMAT[:minute_range]],
|
40
|
+
zone: dtg[FORMAT[:zone_range]],
|
41
|
+
month: dtg[FORMAT[:month_range]],
|
42
|
+
year: dtg[FORMAT[:year_range]]
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
# From will convert from DTG to a Time (not enough data to recreate AS or DateTime)
|
47
|
+
def self.from_dtg(dtg)
|
48
|
+
dtg_hash = parse(dtg)
|
49
|
+
year = dtg_hash[:year].to_i
|
50
|
+
if (Time.now.year % 100) < year
|
51
|
+
year = Time.now.year
|
52
|
+
else
|
53
|
+
year_temp = Time.now.year
|
54
|
+
year += year_temp - year_temp % 100
|
55
|
+
end
|
56
|
+
zone = UTC_ZONES[dtg_hash[:zone].downcase.to_sym].to_s
|
57
|
+
if zone.blank?
|
58
|
+
zone = '+00:00'
|
59
|
+
elsif zone == 'UTC'
|
60
|
+
zone = '+00:00'
|
61
|
+
elsif zone.size == 2
|
62
|
+
zone = zone[0] + '0' + zone[1] + ':00'
|
63
|
+
else
|
64
|
+
zone += ':00'
|
65
|
+
end
|
66
|
+
# Year, month, Day, Hour, Minute, Second, Offset
|
67
|
+
Time.new(
|
68
|
+
year,
|
69
|
+
dtg_hash[:month],
|
70
|
+
dtg_hash[:day].to_i,
|
71
|
+
dtg_hash[:hour].to_i,
|
72
|
+
dtg_hash[:minute].to_i,
|
73
|
+
0,
|
74
|
+
zone
|
75
|
+
)
|
76
|
+
end
|
77
|
+
|
78
|
+
# Change will convert a DTG into a different zone with respect to its zone code
|
79
|
+
def self.convert(dtg, zone = :w)
|
80
|
+
old = from_dtg(dtg)
|
81
|
+
old.to_dtg(zone)
|
82
|
+
end
|
31
83
|
end
|
data/lib/dtg/format.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# Data about the format of a dtg to aid parsing
|
2
|
+
module Format
|
3
|
+
# Structure of a dtg
|
4
|
+
# 01234567890123
|
5
|
+
# DDHHMML MMM YY
|
6
|
+
|
7
|
+
FORMAT = {
|
8
|
+
# Size of
|
9
|
+
size: 14,
|
10
|
+
# Size of day field
|
11
|
+
size_day: 2,
|
12
|
+
# Size of hour field
|
13
|
+
size_hour: 2,
|
14
|
+
# Size of minute field
|
15
|
+
size_minute: 2,
|
16
|
+
# Size of zone field
|
17
|
+
size_zone: 1,
|
18
|
+
# Size of month field
|
19
|
+
size_month: 3,
|
20
|
+
# Size of year field
|
21
|
+
size_year: 2,
|
22
|
+
# Start index of day field
|
23
|
+
day_start: 0,
|
24
|
+
# End index of day field
|
25
|
+
day_end: 1,
|
26
|
+
# Index range of day field
|
27
|
+
day_range: 0..1,
|
28
|
+
# Start index of hour field
|
29
|
+
hour_start: 2,
|
30
|
+
# End index of hour field
|
31
|
+
hour_end: 3,
|
32
|
+
# Index range of hour field
|
33
|
+
hour_range: 2..3,
|
34
|
+
# Start index of minute field
|
35
|
+
minute_start: 4,
|
36
|
+
# End index of minute field
|
37
|
+
minute_end: 5,
|
38
|
+
# Index range of minute field
|
39
|
+
minute_range: 4..5,
|
40
|
+
# Start index of zone field
|
41
|
+
zone_start: 6,
|
42
|
+
# End index of zone field
|
43
|
+
zone_end: 6,
|
44
|
+
# Index range of zone field
|
45
|
+
zone_range: 6..6,
|
46
|
+
# Start index of month field
|
47
|
+
month_start: 8,
|
48
|
+
# End index of month field
|
49
|
+
month_end: 10,
|
50
|
+
# Index range of month field
|
51
|
+
month_range: 8..10,
|
52
|
+
# Start index of year field
|
53
|
+
year_start: 12,
|
54
|
+
# End index of year field
|
55
|
+
year_end: 13,
|
56
|
+
# Index range of year field
|
57
|
+
year_range: 12..13
|
58
|
+
}
|
59
|
+
end
|
data/lib/dtg/time_ext.rb
CHANGED
data/lib/dtg/version.rb
CHANGED
data/lib/dtg/zones.rb
CHANGED
@@ -20,7 +20,7 @@ module Zones
|
|
20
20
|
# I: India Time: UTC +09:00 (Tokyo, Japan)
|
21
21
|
i: +9,
|
22
22
|
# J: Juliet Time: (Local Time Zone)
|
23
|
-
j:
|
23
|
+
j: '',
|
24
24
|
# K: Kilo Time: UTC +10:00 (Sydney, Australia)
|
25
25
|
k: +10,
|
26
26
|
# L: Lima Time: UTC +11:00 (Honiara, Solomon Islands)
|
@@ -52,6 +52,6 @@ module Zones
|
|
52
52
|
# Y: Yankee Time: UTC -12:00 (Suva, Fiji)
|
53
53
|
y: -12,
|
54
54
|
# Z: Zulu Time: UTC +-00:00 (Greenwich, England)
|
55
|
-
z:
|
55
|
+
z: 'UTC'
|
56
56
|
}
|
57
57
|
end
|
@@ -0,0 +1,176 @@
|
|
1
|
+
RSpec.describe ActiveSupport::TimeWithZone do
|
2
|
+
# Set Time Zone before tests
|
3
|
+
before { Time.zone = 'UTC' }
|
4
|
+
|
5
|
+
# ActiveSupport::TimeWithZone preferred method of instantiation is with Time.zone.now, not new
|
6
|
+
let(:time) { Time.zone.now { include DateTimeGroup } }
|
7
|
+
|
8
|
+
describe '#to_dtg' do
|
9
|
+
context 'when zone is a symbol' do
|
10
|
+
context 'when symbol is lowercase' do
|
11
|
+
it 'converts and formats as dtg' do
|
12
|
+
(:a..:z).to_set.delete(:j).each do |zone|
|
13
|
+
expect(time.to_dtg(zone)).to eq(
|
14
|
+
time.in_time_zone(Zones::UTC_ZONES[zone]).strftime(
|
15
|
+
"%d%H%M#{zone.upcase.to_s} %b %y"
|
16
|
+
)
|
17
|
+
)
|
18
|
+
end
|
19
|
+
# :j is separate because there is no local timezone identifier,
|
20
|
+
# it just gets returned and formatted
|
21
|
+
expect(time.to_dtg(:j)).to eq(time.format(:j))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when symbol is uppercase' do
|
26
|
+
it 'converts and formats as dtg' do
|
27
|
+
(:A..:Z).to_set.delete(:J).each do |zone|
|
28
|
+
expect(time.to_dtg(zone)).to eq(
|
29
|
+
time.in_time_zone(Zones::UTC_ZONES[zone.downcase]).strftime(
|
30
|
+
"%d%H%M#{zone.to_s} %b %y"
|
31
|
+
)
|
32
|
+
)
|
33
|
+
end
|
34
|
+
# :J is separate because there is no local timezone identifier,
|
35
|
+
# it just gets returned and formatted
|
36
|
+
expect(time.to_dtg(:J)).to eq(time.format(:j))
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'when zone is a single character string' do
|
42
|
+
context 'when string is lowercase' do
|
43
|
+
it 'converts and formats as dtg' do
|
44
|
+
('a'..'z').to_set.delete('j').each do |zone|
|
45
|
+
expect(time.to_dtg(zone)).to eq(
|
46
|
+
time.in_time_zone(Zones::UTC_ZONES[zone.to_sym]).strftime(
|
47
|
+
"%d%H%M#{zone.upcase} %b %y"
|
48
|
+
)
|
49
|
+
)
|
50
|
+
end
|
51
|
+
# 'j' is separate because there is no local timezone identifier
|
52
|
+
# it just gets returned and formatted
|
53
|
+
expect(time.to_dtg('j')).to eq(time.format(:j))
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'when string is uppercase' do
|
58
|
+
it 'converts and formats as dtg' do
|
59
|
+
('A'..'Z').to_set.delete('J').each do |zone|
|
60
|
+
expect(time.to_dtg(zone)).to eq(
|
61
|
+
time.in_time_zone(Zones::UTC_ZONES[zone.downcase.to_sym])
|
62
|
+
.strftime("%d%H%M#{zone} %b %y")
|
63
|
+
)
|
64
|
+
end
|
65
|
+
# 'J' is separate because there is no local timezone identifier,
|
66
|
+
# it just gets returned and formatted
|
67
|
+
expect(time.to_dtg('J')).to eq(time.format(:j))
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe '#format' do
|
74
|
+
context 'when zone is a symbol' do
|
75
|
+
context 'when symbol is lowercase' do
|
76
|
+
it 'formats to dtg standard' do
|
77
|
+
(:a..:z).each do |zone|
|
78
|
+
expect(time.format(zone)).to eq(
|
79
|
+
time.strftime("%d%H%M#{zone.upcase.to_s} %b %y")
|
80
|
+
)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context 'when symbol is uppercase' do
|
86
|
+
it 'formats to dtg standard' do
|
87
|
+
(:A..:Z).each do |zone|
|
88
|
+
expect(time.format(zone)).to eq(
|
89
|
+
time.strftime("%d%H%M#{zone.to_s} %b %y")
|
90
|
+
)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'when zone is a single character string' do
|
97
|
+
context 'when string is lowercase' do
|
98
|
+
it 'formats to dtg standard' do
|
99
|
+
('a'..'z').each do |zone|
|
100
|
+
expect(time.format(zone)).to eq(
|
101
|
+
time.strftime("%d%H%M#{zone.upcase} %b %y")
|
102
|
+
)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
context 'when string is uppercase' do
|
108
|
+
it 'formats to dtg standard' do
|
109
|
+
('A'..'Z').each do |zone|
|
110
|
+
expect(time.format(zone)).to eq(
|
111
|
+
time.strftime("%d%H%M#{zone} %b %y")
|
112
|
+
)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe '#convert' do
|
120
|
+
context 'when zone is a symbol' do
|
121
|
+
context 'when symbol is lowercase' do
|
122
|
+
it 'returns converted time to new zone' do
|
123
|
+
(:a..:z).to_set.delete(:j).each do |zone|
|
124
|
+
expect(time.convert(zone)).to eq(
|
125
|
+
time.in_time_zone(Zones::UTC_ZONES[zone])
|
126
|
+
)
|
127
|
+
end
|
128
|
+
# :j is separate because there is no local timezone identifier,
|
129
|
+
# it just gets returned and formatted
|
130
|
+
expect(time.convert(:j)).to eq(time)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'when symbol is uppercase' do
|
135
|
+
it 'returns converted time to new zone' do
|
136
|
+
(:A..:Z).to_set.delete(:J).each do |zone|
|
137
|
+
expect(time.convert(zone)).to eq(
|
138
|
+
time.in_time_zone(Zones::UTC_ZONES[zone.downcase])
|
139
|
+
)
|
140
|
+
end
|
141
|
+
# :J is separate because there is no local timezone identifier,
|
142
|
+
# it just gets returned and formatted
|
143
|
+
expect(time.convert(:J)).to eq(time)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
context 'when zone is a single character string' do
|
149
|
+
context 'when string is lowercase' do
|
150
|
+
it 'returns converted time to new zone' do
|
151
|
+
('a'..'z').to_set.delete('j').each do |zone|
|
152
|
+
expect(time.convert(zone)).to eq(
|
153
|
+
time.in_time_zone(Zones::UTC_ZONES[zone.to_sym])
|
154
|
+
)
|
155
|
+
end
|
156
|
+
# 'j' is separate because there is no local timezone identifier,
|
157
|
+
# it just gets returned and formatted
|
158
|
+
expect(time.convert('j')).to eq(time)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
context 'when string is uppercase' do
|
163
|
+
it 'returns converted time to new zone' do
|
164
|
+
('A'..'Z').to_set.delete('J').each do |zone|
|
165
|
+
expect(time.convert(zone)).to eq(
|
166
|
+
time.in_time_zone(Zones::UTC_ZONES[zone.downcase.to_sym])
|
167
|
+
)
|
168
|
+
end
|
169
|
+
# 'J' is separate because there is no local timezone identifier,
|
170
|
+
# it just gets returned and formatted
|
171
|
+
expect(time.convert('J')).to eq(time)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|