time-zone 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 251d7dc390cce283b8d21cc06ec0f8d4e780c4b20e0de7ecbcabfab51d5732e1
4
- data.tar.gz: e4b398d416c342b9a9d885b5742fa547b45753263368df9f0a26277e4b998dae
3
+ metadata.gz: 2f87514b362f81ee4964adead9a93cd19994225c85e06b8c3584caabe8102123
4
+ data.tar.gz: 5a0f736d97c9ad2093d9069a22a043b96e1d91ec53c833b7f8a60ff87e332e3e
5
5
  SHA512:
6
- metadata.gz: 9d194fbd11c1a625ec64e12fa1cda3c01717a5881c1e87aecd701885328ab3a329b48a439c301ebe4ffb044c3117b341f8cb1e6998ef6451165a1e9b6251aafc
7
- data.tar.gz: 2ffa8ecc006284c7ce7bf0e7977edc74f407fc12e34d0368a249e74d50d998df235edf16d7e3fe09fc5c1467d2206f1fdf1c10ef7f0bf07901fe99fc9f7b2e21
6
+ metadata.gz: 79db731b27df02f4a817709403dd0450f780697f47818fb6cd77e07c893509c25a436c2dbd8c2c257191a14f075bee4a3fc3f162ba7b10d532446b2e347a2544
7
+ data.tar.gz: 2c65c7d6ff558e6b00f3629dff240eb0ae0dd2e99dbd985f99a5d7e678962c7f9b7d96b5ddd338e12fa84592ecb953f17e60fd8910962743dfb9ab2f43d7c3ef
data/Gemfile CHANGED
@@ -4,3 +4,12 @@ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
5
  # Specify your gem's dependencies in time-zone.gemspec
6
6
  gemspec
7
+
8
+ group :development do
9
+ gem 'pry'
10
+ end
11
+
12
+ group :test do
13
+ gem 'simplecov'
14
+ gem 'coveralls', require: false
15
+ end
data/README.md CHANGED
@@ -2,10 +2,16 @@
2
2
 
3
3
  A very simple time-zone library which works by manipulating the `TZ` environment variable.
4
4
 
5
+ [![Build Status](https://secure.travis-ci.org/ioquatix/time-zone.svg)](http://travis-ci.org/ioquatix/time-zone)
6
+ [![Code Climate](https://codeclimate.com/github/ioquatix/time-zone.svg)](https://codeclimate.com/github/ioquatix/time-zone)
7
+ [![Coverage Status](https://coveralls.io/repos/ioquatix/time-zone/badge.svg)](https://coveralls.io/r/ioquatix/time-zone)
8
+
5
9
  ## Motivation
6
10
 
7
11
  `tzinfo` has an antiquated view of `Time`. It returns local time values with a UTC time zone which is pretty much wrong.
8
12
 
13
+ [![A brief history of Time.new](https://img.youtube.com/vi/UjdtH5gO_DQ/0.jpg)](https://www.youtube.com/watch?v=UjdtH5gO_DQ)
14
+
9
15
  ## Installation
10
16
 
11
17
  Add this line to your application's Gemfile:
@@ -16,15 +22,15 @@ gem 'time-zone'
16
22
 
17
23
  And then execute:
18
24
 
19
- $ bundle
25
+ $ bundle
20
26
 
21
27
  Or install it yourself as:
22
28
 
23
- $ gem install time-zone
29
+ $ gem install time-zone
24
30
 
25
31
  ## Usage
26
32
 
27
- There are two basic use cases:
33
+ There are two basic use cases, getting the current time, and converting times.
28
34
 
29
35
  ### Current Time
30
36
 
@@ -40,6 +46,23 @@ Time::Zone.convert(Time.now.utc, "Pacific/Auckland")
40
46
  => 2018-05-25 14:14:22 +1200
41
47
  ```
42
48
 
49
+ ### Multiple Operations
50
+
51
+ ```ruby
52
+ Time::Zone.with("US/Pacific") do
53
+ # Be aware that in some cases Time values are lazy initialized, so you need to use #localtime to force them to evaluate and use the current `TZ`.
54
+ time = Time.new.localtime
55
+ puts time.inspect
56
+ # => 2018-05-24 20:32:29 -0700
57
+ end
58
+ ```
59
+
60
+ ### Caveats
61
+
62
+ This implementation manipulates the per-process `TZ` environment variable. This means that if you don't put locking around all your usage of `localtime`, you may end up with strange results (i.e. in a timezone other than the system specified `TZ`). In the future, this requirement may go away.
63
+
64
+ This library is unlikely to work on Windows because it doesn't correctly handle changes to `TZ`.
65
+
43
66
  ## Contributing
44
67
 
45
68
  1. Fork it
data/Rakefile CHANGED
@@ -4,3 +4,10 @@ require "rspec/core/rake_task"
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
6
  task :default => :spec
7
+
8
+ task :console do
9
+ require 'pry'
10
+ require_relative 'lib/time/zone'
11
+
12
+ Pry.start
13
+ end
@@ -20,39 +20,20 @@
20
20
 
21
21
  require_relative 'zone/version'
22
22
 
23
- require 'thread'
23
+ require_relative 'zone/locking'
24
24
 
25
25
  class Time
26
26
  module Zone
27
- @tz = Mutex.new
28
-
29
- def self.with(zone)
30
- @tz.synchronize do
31
- original_zone = ENV['TZ']
32
-
33
- begin
34
- ENV['TZ'] = zone
35
-
36
- yield
37
- ensure
38
- if original_zone
39
- ENV['TZ'] = original_zone
40
- else
41
- ENV.delete('TZ')
42
- end
43
- end
44
- end
45
- end
46
-
47
27
  def self.now(zone)
48
28
  with(zone) do
49
- return Time.now
29
+ # Time instances are lazy initialized, so we need to force it to pick up the current TZ by invoking #localtime
30
+ return Time.new.localtime
50
31
  end
51
32
  end
52
33
 
53
34
  def self.convert(time, zone)
54
35
  with(zone) do
55
- return Time.now
36
+ return time.localtime
56
37
  end
57
38
  end
58
39
  end
@@ -0,0 +1,45 @@
1
+ # Copyright, 2018, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ require 'thread'
22
+
23
+ class Time
24
+ module Zone
25
+ LOCK = Mutex.new
26
+
27
+ def self.with(zone)
28
+ LOCK.synchronize do
29
+ original_zone = ENV['TZ']
30
+
31
+ begin
32
+ ENV['TZ'] = zone
33
+
34
+ yield
35
+ ensure
36
+ if original_zone
37
+ ENV['TZ'] = original_zone
38
+ else
39
+ ENV.delete('TZ')
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -20,6 +20,6 @@
20
20
 
21
21
  class Time
22
22
  module Zone
23
- VERSION = "0.1.0"
23
+ VERSION = "0.2.0"
24
24
  end
25
25
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: time-zone
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -66,6 +66,7 @@ files:
66
66
  - README.md
67
67
  - Rakefile
68
68
  - lib/time/zone.rb
69
+ - lib/time/zone/locking.rb
69
70
  - lib/time/zone/version.rb
70
71
  - time-zone.gemspec
71
72
  homepage: https://github.com/ioquatix/time-zone