evt-clock 0.4.0.2
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 +7 -0
- data/lib/clock.rb +11 -0
- data/lib/clock/clock.rb +141 -0
- data/lib/clock/controls.rb +2 -0
- data/lib/clock/controls/time.rb +28 -0
- data/lib/clock/controls/time/offset.rb +34 -0
- data/lib/clock/local.rb +15 -0
- data/lib/clock/localized.rb +60 -0
- data/lib/clock/localized/timezone.rb +60 -0
- data/lib/clock/substitute.rb +31 -0
- data/lib/clock/utc.rb +33 -0
- metadata +96 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3774995830bf251f1db6d3579490b50349ee2707
|
4
|
+
data.tar.gz: 881f4843ee93399302a4c8eb3d8aa09c9b85ffc4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 05a468f10b8e34e7d10b49d6e9f8fe26a689ceeb33dc4231fbf97b16956fee2e550eb0abacf75949031c40a2237b83f7fa641cced1ad9f6b6ad0285ab053ff63
|
7
|
+
data.tar.gz: db2e35f806c8393b2e87f5c3a598e7ef391537727c24db0910500c68e3dfd14aca6d5e237295a123a3b2f288f322a044d1652e8bd4bed2fbc779e215d2592171
|
data/lib/clock.rb
ADDED
data/lib/clock/clock.rb
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
module Clock
|
2
|
+
class Error < RuntimeError; end
|
3
|
+
|
4
|
+
def self.included(cls)
|
5
|
+
cls.extend Now
|
6
|
+
cls.extend Canonize
|
7
|
+
cls.extend SystemTime
|
8
|
+
cls.extend ISO8601
|
9
|
+
cls.extend Parse
|
10
|
+
cls.extend ElapsedMilliseconds
|
11
|
+
cls.extend Timestamp
|
12
|
+
cls.extend Configure
|
13
|
+
end
|
14
|
+
|
15
|
+
def now(time=nil)
|
16
|
+
time || self.class.now(system_time: system_time)
|
17
|
+
end
|
18
|
+
|
19
|
+
def canonize(time)
|
20
|
+
self.class.canonize(time, system_time)
|
21
|
+
end
|
22
|
+
|
23
|
+
def system_time
|
24
|
+
self.class.system_time
|
25
|
+
end
|
26
|
+
|
27
|
+
def iso8601(time=nil, precision: nil)
|
28
|
+
time ||= now
|
29
|
+
self.class.iso8601 time, precision: precision, system_time: system_time
|
30
|
+
end
|
31
|
+
|
32
|
+
def parse(str)
|
33
|
+
time = self.class.parse(str, system_time: system_time)
|
34
|
+
end
|
35
|
+
|
36
|
+
def timestamp(time=nil)
|
37
|
+
self.class.timestamp time
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.local(time)
|
41
|
+
time.getlocal
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.localized(time, identifier)
|
45
|
+
clock = Localized.build identifier
|
46
|
+
clock.canonize time
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.utc(time)
|
50
|
+
time.utc
|
51
|
+
end
|
52
|
+
|
53
|
+
def elapsed_milliseconds(start_time, end_time)
|
54
|
+
self.class.elapsed_milliseconds(start_time, end_time)
|
55
|
+
end
|
56
|
+
|
57
|
+
module Now
|
58
|
+
def now(time=nil, system_time: nil)
|
59
|
+
system_time ||= self.system_time
|
60
|
+
time ||= system_time.now
|
61
|
+
canonize(time, system_time)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
module Canonize
|
66
|
+
def canonize(time, system_time)
|
67
|
+
time
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
module SystemTime
|
72
|
+
extend self
|
73
|
+
def system_time
|
74
|
+
Time
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
module ISO8601
|
79
|
+
extend self
|
80
|
+
def iso8601(time=nil, precision: nil, system_time: nil)
|
81
|
+
precision ||= self.precision
|
82
|
+
time ||= now(system_time: system_time)
|
83
|
+
time.iso8601(precision)
|
84
|
+
end
|
85
|
+
|
86
|
+
def precision
|
87
|
+
Defaults.precision
|
88
|
+
end
|
89
|
+
|
90
|
+
module Defaults
|
91
|
+
def self.precision
|
92
|
+
3
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
module Parse
|
98
|
+
extend self
|
99
|
+
def parse(str, system_time: nil)
|
100
|
+
system_time ||= self.system_time
|
101
|
+
time = Time.parse str
|
102
|
+
canonize(time, system_time)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
module ElapsedMilliseconds
|
107
|
+
extend self
|
108
|
+
def elapsed_milliseconds(start_time, end_time=nil, system_time: nil)
|
109
|
+
end_time ||= now(system_time: system_time)
|
110
|
+
|
111
|
+
start_time = parse(start_time) if start_time.is_a? String
|
112
|
+
end_time = parse(end_time) if end_time.is_a? String
|
113
|
+
|
114
|
+
((end_time - start_time) * 1000).round
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
module Timestamp
|
119
|
+
extend self
|
120
|
+
def timestamp(time=nil, system_time: nil)
|
121
|
+
time ||= now(system_time: system_time)
|
122
|
+
time.to_f
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
module Configure
|
127
|
+
def configure(receiver)
|
128
|
+
instance = new
|
129
|
+
receiver.clock = instance
|
130
|
+
instance
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
extend Now
|
135
|
+
extend Canonize
|
136
|
+
extend SystemTime
|
137
|
+
extend ISO8601
|
138
|
+
extend Parse
|
139
|
+
extend ElapsedMilliseconds
|
140
|
+
extend Timestamp
|
141
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Clock
|
2
|
+
module Controls
|
3
|
+
module Time
|
4
|
+
def self.example(time=nil, precision: nil)
|
5
|
+
time ||= Raw.example
|
6
|
+
|
7
|
+
ISO8601.example(time, precision: precision)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.reference
|
11
|
+
::Time.utc 2000
|
12
|
+
end
|
13
|
+
|
14
|
+
module Raw
|
15
|
+
def self.example
|
16
|
+
Time.reference
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
module ISO8601
|
21
|
+
def self.example(time=nil, precision: nil)
|
22
|
+
time ||= Raw.example
|
23
|
+
UTC.iso8601(time, precision: precision)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Clock
|
2
|
+
module Controls
|
3
|
+
module Time
|
4
|
+
module Offset
|
5
|
+
def self.example(amount=nil, precision: nil, time: nil)
|
6
|
+
offset_time = Raw.example amount, precision: precision, time: time
|
7
|
+
|
8
|
+
ISO8601.example offset_time, precision: precision
|
9
|
+
end
|
10
|
+
|
11
|
+
module Raw
|
12
|
+
def self.example(amount=nil, precision: nil, time: nil)
|
13
|
+
amount ||= 1
|
14
|
+
time ||= Time::Raw.example
|
15
|
+
|
16
|
+
scale = scale(precision: precision)
|
17
|
+
|
18
|
+
offset = amount * scale
|
19
|
+
|
20
|
+
time + offset
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.scale(precision: nil)
|
24
|
+
precision ||= Clock::ISO8601::Defaults.precision
|
25
|
+
|
26
|
+
scale = 10 ** precision
|
27
|
+
|
28
|
+
Rational(1, scale)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/clock/local.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
module Clock
|
2
|
+
class Localized
|
3
|
+
include Clock
|
4
|
+
|
5
|
+
attr_reader :timezone
|
6
|
+
|
7
|
+
def initialize(timezone)
|
8
|
+
@timezone = timezone
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.build(timezone_identifier=nil, utc_reference: nil)
|
12
|
+
timezone = Timezone.build timezone_identifier, utc_reference: utc_reference
|
13
|
+
new(timezone)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.configure(receiver, timezone_identifier=nil)
|
17
|
+
instance = build(timezone_identifier)
|
18
|
+
receiver.clock = instance
|
19
|
+
instance
|
20
|
+
end
|
21
|
+
|
22
|
+
def system_time
|
23
|
+
timezone
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.canonize(time, system_time)
|
27
|
+
time = time.utc
|
28
|
+
system_time.utc_to_local time
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.iso8601(time, precision: nil, system_time: nil)
|
32
|
+
time ||= now time, system_time: system_time
|
33
|
+
utc_time = time.utc
|
34
|
+
local_time = system_time.utc_to_local utc_time
|
35
|
+
local_time.iso8601 precision
|
36
|
+
end
|
37
|
+
|
38
|
+
module Defaults
|
39
|
+
def self.timezone_identifier(timezone_identifier)
|
40
|
+
env_identifier = ENV['TIMEZONE']
|
41
|
+
|
42
|
+
if env_identifier
|
43
|
+
timezone_identifier = env_identifier
|
44
|
+
end
|
45
|
+
|
46
|
+
unless timezone_identifier
|
47
|
+
timezone_identifier = 'America/Mexico_City'
|
48
|
+
end
|
49
|
+
|
50
|
+
timezone_identifier
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
module Substitute
|
55
|
+
def self.build
|
56
|
+
Clock::Substitute.new
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Clock
|
2
|
+
class Localized
|
3
|
+
class Timezone
|
4
|
+
attr_reader :tzinfo_timezone
|
5
|
+
attr_reader :utc_reference
|
6
|
+
|
7
|
+
def initialize(tzinfo_timezone, utc_reference)
|
8
|
+
@tzinfo_timezone = tzinfo_timezone
|
9
|
+
@utc_reference = utc_reference
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.build(timezone_identifier=nil, utc_reference: nil)
|
13
|
+
utc_reference ||= Time.now.utc
|
14
|
+
|
15
|
+
timezone_identifier = Defaults.timezone_identifier(timezone_identifier)
|
16
|
+
tzinfo_timezone = TZInfo::Timezone.get(timezone_identifier)
|
17
|
+
|
18
|
+
new tzinfo_timezone, utc_reference
|
19
|
+
end
|
20
|
+
|
21
|
+
def period
|
22
|
+
tzinfo_timezone.period_for_utc utc_reference
|
23
|
+
end
|
24
|
+
|
25
|
+
def now(tzinfo_time=nil)
|
26
|
+
tzinfo_time ||= tzinfo_timezone.now
|
27
|
+
convert tzinfo_time
|
28
|
+
end
|
29
|
+
|
30
|
+
def utc_to_local(utc_time)
|
31
|
+
tzinfo_time = tzinfo_timezone.utc_to_local utc_time
|
32
|
+
convert tzinfo_time
|
33
|
+
end
|
34
|
+
|
35
|
+
def convert(tzinfo_time)
|
36
|
+
seconds = tzinfo_time.sec + tzinfo_time.subsec
|
37
|
+
|
38
|
+
Time.new(
|
39
|
+
tzinfo_time.year,
|
40
|
+
tzinfo_time.month,
|
41
|
+
tzinfo_time.day,
|
42
|
+
tzinfo_time.hour,
|
43
|
+
tzinfo_time.min,
|
44
|
+
seconds,
|
45
|
+
offset
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
def offset
|
50
|
+
total_offset = period.offset.utc_total_offset
|
51
|
+
|
52
|
+
hours, seconds = total_offset.abs.divmod 3600
|
53
|
+
minutes = seconds / 60
|
54
|
+
|
55
|
+
sign = total_offset > 0 ? '+' : '-'
|
56
|
+
offset = "#{sign}#{hours.to_s.rjust(2, '0')}:#{minutes.to_s.rjust(2, '0')}"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Clock
|
2
|
+
class Substitute
|
3
|
+
include Clock
|
4
|
+
|
5
|
+
attr_writer :system_time
|
6
|
+
|
7
|
+
def system_time
|
8
|
+
@system_time ||= NullTime.build
|
9
|
+
end
|
10
|
+
|
11
|
+
def now=(val)
|
12
|
+
system_time = OpenStruct.new
|
13
|
+
system_time.now = val
|
14
|
+
self.system_time = system_time
|
15
|
+
system_time
|
16
|
+
end
|
17
|
+
|
18
|
+
def iso8601(*args)
|
19
|
+
if system_time.is_a? OpenStruct
|
20
|
+
return super(*args)
|
21
|
+
end
|
22
|
+
nil
|
23
|
+
end
|
24
|
+
|
25
|
+
class NullTime < Naught.build
|
26
|
+
def self.build
|
27
|
+
new
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/clock/utc.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
module Clock
|
2
|
+
class UTC
|
3
|
+
include Clock
|
4
|
+
|
5
|
+
def self.canonize(time, *)
|
6
|
+
Clock.utc(time)
|
7
|
+
end
|
8
|
+
|
9
|
+
def coerce(time)
|
10
|
+
self.class.shift(time)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.coerce(time)
|
14
|
+
if time.is_a? String
|
15
|
+
time = Time.parse(time)
|
16
|
+
end
|
17
|
+
|
18
|
+
offset = time.gmt_offset
|
19
|
+
|
20
|
+
utc_time = time.getutc
|
21
|
+
|
22
|
+
utc_time = utc_time + offset
|
23
|
+
|
24
|
+
now(utc_time)
|
25
|
+
end
|
26
|
+
|
27
|
+
module Substitute
|
28
|
+
def self.build
|
29
|
+
Clock::Substitute.new
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: evt-clock
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- The Eventide Project
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-12-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: tzinfo
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: naught
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: ntl-test_bench
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: " "
|
56
|
+
email: opensource@eventide-project.org
|
57
|
+
executables: []
|
58
|
+
extensions: []
|
59
|
+
extra_rdoc_files: []
|
60
|
+
files:
|
61
|
+
- lib/clock.rb
|
62
|
+
- lib/clock/clock.rb
|
63
|
+
- lib/clock/controls.rb
|
64
|
+
- lib/clock/controls/time.rb
|
65
|
+
- lib/clock/controls/time/offset.rb
|
66
|
+
- lib/clock/local.rb
|
67
|
+
- lib/clock/localized.rb
|
68
|
+
- lib/clock/localized/timezone.rb
|
69
|
+
- lib/clock/substitute.rb
|
70
|
+
- lib/clock/utc.rb
|
71
|
+
homepage: https://github.com/eventide-project/clock
|
72
|
+
licenses:
|
73
|
+
- MIT
|
74
|
+
metadata: {}
|
75
|
+
post_install_message:
|
76
|
+
rdoc_options: []
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 2.3.3
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
requirements: []
|
90
|
+
rubyforge_project:
|
91
|
+
rubygems_version: 2.5.2
|
92
|
+
signing_key:
|
93
|
+
specification_version: 4
|
94
|
+
summary: Clock interface with support for dependency configuration for real and null
|
95
|
+
object implementations
|
96
|
+
test_files: []
|