Compare commits

..

68 Commits

Author SHA1 Message Date
Dirkjan Bussink
529749e01b Bump Rails version 2014-06-02 09:55:18 +02:00
Dirkjan Bussink
e9b3b09e08 Merge pull request #70 from github/dbussink-update-tzinfo
Update vendored tzinfo
2014-06-02 09:54:55 +02:00
Dirkjan Bussink
1992a86b2e Fix vendor path 2014-06-02 09:52:09 +02:00
Dirkjan Bussink
443815c4fe Bump vendored tzinfo to latest 0.3.x version 2014-06-02 09:47:28 +02:00
Greg Ose
52abaed4b3 Merge pull request #69 from github/allow-false-in-session
Allow false in session
2014-05-23 15:43:44 -05:00
Greg Ose
5b0053b2a8 bump rails version 2014-05-23 11:59:56 -05:00
Greg Ose
1b98a0d72f delete can take a block and allow nil to be returned 2014-05-20 13:35:41 -05:00
Greg Ose
1f59a8dfe8 also stringify keys on update 2014-05-16 15:26:41 -05:00
Greg Ose
e1011ea095 Allow a false value to be returned from symbol keyed session 2014-05-16 12:57:41 -05:00
Greg Ose
730e6a273c Merge pull request #64 from github/json-sessions
Support custom serialization for Session::CookieStore
2014-05-16 00:06:44 -05:00
Greg Ose
aa1b6d1284 bump rails version 2014-05-15 22:49:19 -05:00
Greg Ose
5f6c95e29e Merge branch '2-3-github' into json-sessions 2014-05-13 15:29:47 -05:00
Charlie Somerville
7403667b89 Merge pull request #67 from github/2-3-github+cve-2014-0130
CVE-2014-0130 protection
2014-05-10 00:52:08 +10:00
Charlie Somerville
1a45ec57bf CVE-2014-0130 protection 2014-05-09 23:55:20 +10:00
Greg Ose
9070fbcffe Revert nested hash indifference, swap delete order
Upstream doesnt support nested hashes having indifferent access, we
should stay consistent. Swap order for returned value in session hash.
2014-05-07 14:27:52 -05:00
Greg Ose
364b534815 support indifferent access for hashes stored within FlashHash 2014-04-30 13:18:28 -05:00
Greg Ose
14da203564 indifferent delete 2014-04-29 10:37:53 -05:00
Greg Ose
f46a4bab08 indifferent access to flash hash 2014-04-29 10:21:16 -05:00
Greg Ose
198aa6ef99 Update tests to load flash from session value 2014-04-28 15:07:52 -05:00
Greg Ose
b3ae51c9fc Add serializer option to cookie store and use Rails 4 Hash flash
Backport for Rails 4 flash hash based on https://github.com/envato/rails_4_session_flash_backport
2014-04-28 14:42:24 -05:00
Patrick Toomey
1e6e438f6e Update RAILS_VERSION 2014-04-24 10:45:25 -05:00
Patrick Toomey
2b01f832a3 Merge pull request #63 from github/memoize-nil-check
make sure nil isn't memoized and frozen
2014-04-24 10:44:47 -05:00
Patrick Toomey
1e5fda763e backport memoiziation from 3.0 2014-04-24 10:24:04 -05:00
Dirkjan Bussink
7c3d4ec43c Bump version 2014-03-31 13:43:08 +02:00
Dirkjan Bussink
7343ed7b05 Merge pull request #53 from github/dbussink/no-toplevel-exception-rescue
We shouldn't try to rescue every type of exception here
2014-03-31 11:42:02 +00:00
Dirkjan Bussink
2a70c9691d We shouldn't try to rescue every type of exception here 2014-03-31 13:35:28 +02:00
Dirkjan Bussink
a141d9de0d bump 2.3.14.github41 2014-03-27 13:55:26 +01:00
Dirkjan Bussink
74492f43a8 Merge pull request #51 from github/dbussink/fix-logging-frozen-string-query
Dup string before changing encoding because it might be frozen
2014-03-27 12:53:25 +00:00
Dirkjan Bussink
c2894170bf Dup string before changing encoding because it might be frozen
Calling String#force_encoding! on a frozen string throws an exception.
By dupping the string we prevent this from happening.
2014-03-27 13:47:08 +01:00
Charlie Somerville
057aed6e18 Merge pull request #48 from github/2-3-kill-backtick-monkey-patch
[2.3] Kill Object#` monkey patch
2014-02-23 23:20:47 +11:00
Charlie Somerville
02fc012b42 kill Object#` monkey patch 2014-02-23 23:17:44 +11:00
Mastahyeti
4fdaf21b28 bump 2.3.14.github40 2014-02-18 15:28:32 -06:00
Ben Toews
35b871fbcd Merge pull request #47 from github/CVE-2014-0081
CVE-2014-0081
2014-02-18 15:28:00 -06:00
Mastahyeti
a5697840d6 escape format for CVE-2014-0081 2014-02-18 15:25:05 -06:00
Andy Lindeman
d0e554d231 Bumps to github39 2014-02-14 00:12:09 -05:00
Andy Lindeman
d38b7664cc github38 2014-02-13 22:36:14 -05:00
Andy Lindeman
e4cd9caf02 Merge pull request #46 from github/runtime_header
Removes the X-Runtime header from ActionController::Benchmarking
2014-02-13 22:34:18 -05:00
Andy Lindeman
89e4514704 Removes the X-Runtime header from ActionController::Benchmarking
The `Rack::Runtime` middleware now provides this header
2014-02-13 22:25:27 -05:00
Joshua Peek
0a0d975f51 github37 2014-02-11 23:36:30 -06:00
Joshua Peek
62daf4cb6f Merge pull request #45 from github/rack-session-skip
Backport Rack session skip
2014-02-11 23:34:52 -06:00
Joshua Peek
24711e1e29 Backport env['rack.session.options'][:skip] 2014-02-11 23:22:39 -06:00
Charlie Somerville
cf8f36930c Merge pull request #44 from github/builder-3.2.2
Builder 3.2.2
2014-01-20 19:55:16 -08:00
Charlie Somerville
d622643e47 fix tests 2014-01-21 14:30:00 +11:00
Charlie Somerville
3f0241a613 use assert_includes so we get a useful failure message 2014-01-21 14:28:01 +11:00
Charlie Somerville
38a7432590 add builder 3.2.2 to Gemfile.sh and use that instead of vendored copy 2014-01-21 14:22:20 +11:00
Charlie Somerville
1220d3c3ed delete vendored builder 2.1.2 2014-01-21 14:16:36 +11:00
Charlie Somerville
3d72818356 Merge pull request #43 from github/i18n-0.6.9
i18n 0.4.1
2014-01-20 18:05:20 -08:00
Charlie Somerville
221477dc21 fix this bit 2014-01-21 12:51:40 +11:00
Charlie Somerville
975155c110 use i18n 0.6.9 as a gem 2014-01-21 12:33:39 +11:00
Charlie Somerville
2931987892 delete vendored i18n-0.4.1 2014-01-21 12:25:44 +11:00
Charlie Somerville
e3290b98dd Merge pull request #42 from github/dont-test-on-1.9
Don't run tests on 1.9.3
2014-01-20 17:25:13 -08:00
Charlie Somerville
20088080a5 Don't run tests on 1.9.3 2014-01-21 12:23:05 +11:00
Dirkjan Bussink
24e348489d github36 2014-01-17 18:10:31 +01:00
Dirkjan Bussink
ba4f4f8a01 Treat mysql in the name as a mysql driver 2014-01-17 18:05:20 +01:00
Aman Gupta
ccf254b6cb build using 2.1 first 2014-01-15 01:10:18 -08:00
Mislav Marohnić
3766b1b377 github35 2014-01-13 13:58:57 -08:00
Mislav Marohnić
d3f87776a3 Merge pull request #41 from github/disable-generated-id
Disable auto-generated form field IDs by passing nil for "id" attribute
2014-01-13 13:57:38 -08:00
Mislav Marohnić
18c7c1f753 Disable auto-generated form field IDs by passing nil for "id" attribute
Previously it was not possible to opt out of auto-generated ID values
for various form fields.
2014-01-13 13:22:06 -08:00
Aman Gupta
f63b0340ff github34 2014-01-08 21:04:30 -08:00
Aman Gupta
7224ee1419 Merge pull request #37 from github/erb-freeze
Freeze ERB string literals
2014-01-08 20:33:01 -08:00
Aman Gupta
0c52ae6df3 Merge pull request #39 from github/write-fragment-fix
Fix fragment caching in mixed encoding scenario
2014-01-08 20:32:40 -08:00
Aman Gupta
f8b7cd2df7 Merge pull request #40 from github/ruby-2.1
Ruby 2.1
2014-01-08 20:32:12 -08:00
Aman Gupta
c73ba86136 use new 2.1 api 2014-01-08 18:03:55 -08:00
Aman Gupta
98fa5dd465 build on ruby 2.1 2014-01-08 17:46:13 -08:00
Mislav Marohnić
fa41bedf6b Don't rely on default encoding always being ASCII-8BIT 2014-01-08 17:41:17 -08:00
Aman Gupta
0a8282c557 freeze literals 2014-01-08 17:28:31 -08:00
Mislav Marohnić
d4a4facfcc Add test for extracting the cache fragment with mixed encodings 2014-01-08 17:12:18 -08:00
Aman Gupta
dd4146854a Fix fragment caching in mixed encodings scenario
To reduce ambiguity between char- and byte-based operations, explicitly
do byte operations when extracting the fragment that needs to be cached.
2014-01-08 16:35:55 -08:00
718 changed files with 35720 additions and 6716 deletions

View File

@@ -5,3 +5,5 @@ gem install sqlite3 -v=1.3.7
gem install rack -v=1.4.5
gem install erubis -v=2.7.0
gem install json -v=1.8.0
gem install i18n -v=0.6.9
gem install builder -v=3.2.2

View File

@@ -1 +1 @@
2.3.14.github33
2.3.14.github47

View File

@@ -1320,7 +1320,14 @@ module ActionController #:nodoc:
render
end
CVE_2014_0310 = Class.new(StandardError)
def perform_action
# CVE-2014-0130 protection
if action_name.include? "/"
raise CVE_2014_0310
end
if action_methods.include?(action_name)
send(action_name)
default_render unless performed?

View File

@@ -87,7 +87,6 @@ module ActionController #:nodoc:
log_message << " [#{complete_request_uri rescue "unknown"}]"
logger.info(log_message)
response.headers["X-Runtime"] = "%.0f" % ms
else
perform_action_without_benchmark
end

View File

@@ -39,9 +39,9 @@ module ActionController #:nodoc:
if cache = read_fragment(name, options)
buffer.safe_concat(cache.html_safe)
else
pos = buffer.length
pos = buffer.bytesize
block.call
write_fragment(name, buffer[pos..-1], options)
write_fragment(name, buffer.byteslice(pos..-1), options)
end
else
block.call

View File

@@ -45,37 +45,74 @@ module ActionController #:nodoc:
end
def []=(k, v)
k = k.to_s
@flash[k] = v
@flash.discard(k)
v
end
def [](k)
@flash[k]
@flash[k.to_s]
end
end
class FlashHash < Hash
def self.from_session_value(value)
flash = case value
when FlashHash # Rails 2.3
value
when Hash # Rails 4.0
flashes = value['flashes'] || {}
flashes.stringify_keys!
discard = value['discard'] || []
discard = discard.map do |item|
item.kind_of?(Symbol) ? item.to_s : item
end
used = Hash[flashes.keys.map{|k| [k, discard.include?(k)] }]
new_from_values(flashes, used)
else
new
end
flash
end
def initialize #:nodoc:
super
@used = {}
end
def to_session_value
return nil if empty?
rails_3_discard_list = @used.map{|k,v| k if v}.compact
{'discard' => rails_3_discard_list, 'flashes' => Hash[to_a]}
end
def []=(k, v) #:nodoc:
k = k.to_s
keep(k)
super
super(k, v)
end
def [](k)
super(k.to_s)
end
def delete(k)
super(k.to_s)
end
def update(h) #:nodoc:
h.stringify_keys!
h.keys.each { |k| keep(k) }
super
super(h)
end
alias :merge! :update
def replace(h) #:nodoc:
@used = {}
super
super(h.stringify_keys)
end
# Sets a flash that will not be available to the next action, only to the current.
@@ -126,8 +163,7 @@ module ActionController #:nodoc:
end
def store(session, key = "flash")
return if self.empty?
session[key] = self
session[key] = to_session_value
end
private
@@ -138,11 +174,20 @@ module ActionController #:nodoc:
# use('msg', false) # marks the "msg" entry as unused (keeps it around for one more action)
def use(k=nil, v=true)
unless k.nil?
@used[k] = v
@used[k.to_s] = v
else
keys.each{ |key| use(key, v) }
end
end
def self.new_from_values(flashes, used)
new.tap do |flash_hash|
flashes.each do |k, v|
flash_hash[k] = v
end
flash_hash.instance_variable_set("@used", used)
end
end
end
module InstanceMethods #:nodoc:
@@ -168,11 +213,11 @@ module ActionController #:nodoc:
if notice = response_status_and_flash.delete(:notice)
flash[:notice] = notice
end
if other_flashes = response_status_and_flash.delete(:flash)
flash.update(other_flashes)
end
redirect_to_without_flash(options, response_status_and_flash)
end
@@ -181,19 +226,19 @@ module ActionController #:nodoc:
# to put a new one.
def flash #:doc:
if !defined?(@_flash)
@_flash = session["flash"] || FlashHash.new
@_flash = Flash::FlashHash.from_session_value(session["flash"])
@_flash.sweep
end
@_flash
end
# Convenience accessor for flash[:alert]
def alert
flash[:alert]
end
# Convenience accessor for flash[:alert]=
def alert=(message)
flash[:alert] = message
@@ -203,7 +248,7 @@ module ActionController #:nodoc:
def notice
flash[:notice]
end
# Convenience accessor for flash[:notice]=
def notice=(message)
flash[:notice] = message

View File

@@ -2,7 +2,7 @@ require 'rack/utils'
module ActionController
module Session
class AbstractStore
class AbstractStore
ENV_SESSION_KEY = 'rack.session'.freeze
ENV_SESSION_OPTIONS_KEY = 'rack.session.options'.freeze
@@ -55,17 +55,17 @@ module ActionController
def [](key)
load_for_read!
super
fetch(key.to_s, super(key))
end
def has_key?(key)
load_for_read!
super
super(key.to_s) || super(key)
end
def []=(key, value)
load_for_write!
super
super(key.to_s, value)
end
def clear
@@ -82,12 +82,19 @@ module ActionController
def update(hash)
load_for_write!
super
super(hash.stringify_keys)
end
def delete(key)
load_for_write!
super
if has_key? key
value = self[key]
super(key)
super(key.to_s)
value
else
super
end
end
def data
@@ -119,7 +126,7 @@ module ActionController
end
private
def load_for_read!
load! if !loaded? && exists?
end
@@ -183,7 +190,7 @@ module ActionController
request = ActionController::Request.new(env)
return response if (options[:secure] && !request.ssl?)
session_data.send(:load!) if session_data.is_a?(AbstractStore::SessionHash) && !session_data.loaded?
sid = options[:id] || generate_sid
@@ -205,12 +212,12 @@ module ActionController
end
private
def prepare!(env)
env[ENV_SESSION_KEY] = SessionHash.new(self, env)
env[ENV_SESSION_OPTIONS_KEY] = OptionsHash.new(self, env, @default_options)
end
def generate_sid
ActiveSupport::SecureRandom.hex(16)
end
@@ -222,7 +229,7 @@ module ActionController
[sid, session]
end
end
def extract_session_id(env)
stale_session_check! do
request = Rack::Request.new(env)
@@ -235,7 +242,7 @@ module ActionController
def current_session_id(env)
env[ENV_SESSION_OPTIONS_KEY][:id]
end
def exists?(env)
current_session_id(env).present?
end
@@ -247,11 +254,11 @@ module ActionController
def set_session(env, sid, session_data)
raise '#set_session needs to be implemented.'
end
def destroy(env)
raise '#destroy needs to be implemented.'
end
module SessionUtils
private
def stale_session_check!

View File

@@ -37,7 +37,7 @@ module ActionController
# Note that changing digest or secret invalidates all existing sessions!
class CookieStore
include AbstractStore::SessionUtils
# Cookies can typically store 4096 bytes.
MAX = 4096
SECRET_MIN_LENGTH = 30 # characters
@@ -86,7 +86,8 @@ module ActionController
@secret = options.delete(:secret).freeze
@digest = options.delete(:digest) || 'SHA1'
@verifier = verifier_for(@secret, @digest)
@serializer = options.delete(:serializer) || Marshal
@verifier = verifier_for(@secret, @digest, @serializer)
@default_options = DEFAULT_OPTIONS.merge(options).freeze
@@ -95,14 +96,21 @@ module ActionController
def call(env)
prepare!(env)
status, headers, body = @app.call(env)
session_data = env[ENV_SESSION_KEY]
options = env[ENV_SESSION_OPTIONS_KEY]
request = ActionController::Request.new(env)
if !(options[:secure] && !request.ssl?) && (!session_data.is_a?(AbstractStore::SessionHash) || session_data.loaded? || options[:expire_after])
# Backport standard Rack::Session::Cookie behavior
# Skip writing session if env['rack.session.options'][:skip] is set
if options[:skip]
return [status, headers, body]
end
session_data.send(:load!) if session_data.is_a?(AbstractStore::SessionHash) && !session_data.loaded?
persistent_session_id!(session_data)
@@ -122,7 +130,7 @@ module ActionController
end
private
def prepare!(env)
env[ENV_SESSION_KEY] = AbstractStore::SessionHash.new(self, env)
env[ENV_SESSION_OPTIONS_KEY] = AbstractStore::OptionsHash.new(self, env, @default_options)
@@ -131,13 +139,13 @@ module ActionController
def load_session(env)
data = unpacked_cookie_data(env)
data = persistent_session_id!(data)
[data[:session_id], data]
[data["session_id"] || data[:session_id], data]
end
def extract_session_id(env)
if data = unpacked_cookie_data(env)
persistent_session_id!(data) unless data.empty?
data[:session_id]
data["session_id"] || data[:session_id]
else
nil
end
@@ -207,9 +215,9 @@ module ActionController
end
end
def verifier_for(secret, digest)
def verifier_for(secret, digest, serializer)
key = secret.respond_to?(:call) ? secret.call : secret
ActiveSupport::MessageVerifier.new(key, digest: digest)
ActiveSupport::MessageVerifier.new(key, digest: digest, serializer: serializer)
end
def generate_sid
@@ -225,12 +233,12 @@ module ActionController
end
def inject_persistent_session_id(data)
requires_session_id?(data) ? { :session_id => generate_sid } : {}
requires_session_id?(data) ? { "session_id" => generate_sid } : {}
end
def requires_session_id?(data)
if data
data.respond_to?(:key?) && !data.key?(:session_id)
data.respond_to?(:key?) && !(data.key?("session_id") || data.key?(:session_id))
else
true
end

View File

@@ -219,7 +219,7 @@ module ActionController #:nodoc:
# A shortcut to the flash. Returns an empty hash if no session flash exists.
def flash
session['flash'] || {}
ActionController::Flash::FlashHash.from_session_value(session["flash"]) || {}
end
# Do we have a flash?

View File

@@ -768,7 +768,11 @@ module ActionView
options = options.stringify_keys
tag_value = options.delete("value")
name_and_id = options.dup
name_and_id["id"] = name_and_id["for"]
if name_and_id.has_key?("for")
name_and_id["id"] = name_and_id["for"]
else
name_and_id.delete("id")
end
add_default_name_and_id_for_value(tag_value, name_and_id)
options.delete("index")
options["for"] ||= name_and_id["id"]
@@ -928,15 +932,15 @@ module ActionView
def add_default_name_and_id(options)
if options.has_key?("index")
options["name"] ||= tag_name_with_index(options["index"])
options["id"] ||= tag_id_with_index(options["index"])
options["name"] = tag_name_with_index(options["index"]) unless options.has_key?("name")
options["id"] = tag_id_with_index(options["index"]) unless options.has_key?("id")
options.delete("index")
elsif defined?(@auto_index)
options["name"] ||= tag_name_with_index(@auto_index)
options["id"] ||= tag_id_with_index(@auto_index)
options["name"] = tag_name_with_index(@auto_index) unless options.has_key?("name")
options["id"] = tag_id_with_index(@auto_index) unless options.has_key?("id")
else
options["name"] ||= tag_name + (options.has_key?('multiple') ? '[]' : '')
options["id"] ||= tag_id
options["name"] = tag_name + (options.has_key?('multiple') ? '[]' : '') unless options.has_key?("name")
options["id"] = tag_id unless options.has_key?("id")
end
end

View File

@@ -73,6 +73,8 @@ module ActionView
def number_to_currency(number, options = {})
options.symbolize_keys!
options[:format] = ERB::Util.html_escape(options[:format]) if options[:format]
defaults = I18n.translate(:'number.format', :locale => options[:locale], :raise => true) rescue {}
currency = I18n.translate(:'number.currency.format', :locale => options[:locale], :raise => true) rescue {}
defaults = defaults.merge(currency)

View File

@@ -17,7 +17,7 @@ module ActionView
src << "@output_buffer.safe_append='"
src << "\n" * @newline_pending if @newline_pending > 0
src << escape_text(text)
src << "';"
src << "'.freeze;"
@newline_pending = 0
end
@@ -63,7 +63,7 @@ module ActionView
def flush_newline_if_pending(src)
if @newline_pending > 0
src << "@output_buffer.safe_append='#{"\n" * @newline_pending}';"
src << "@output_buffer.safe_append='#{"\n" * @newline_pending}'.freeze;"
@newline_pending = 0
end
end

View File

@@ -622,6 +622,19 @@ class FragmentCachingTest < ActionController::TestCase
assert_equal 'generated till now -> fragment content', buffer
end
def test_fragment_for_bytesize
buffer = "\xC4\x8D"
buffer.force_encoding('ASCII-8BIT')
@controller.fragment_for(buffer, 'bytesize') do
buffer.force_encoding('UTF-8')
buffer << "abc"
end
assert_equal Encoding::UTF_8, buffer.encoding
assert_equal "abc", @store.read('views/bytesize')
end
def test_html_safety
assert_nil @store.read('views/name')
content = 'value'.html_safe

View File

@@ -175,6 +175,10 @@ class FormHelperTest < ActionView::TestCase
I18n.locale = old_locale
end
def test_label_with_for_attribute_as_nil
assert_dom_equal('<label>Title</label>', label(:post, :title, nil, :for => nil))
end
def test_label_with_for_attribute_as_symbol
assert_dom_equal('<label for="my_for">Title</label>', label(:post, :title, nil, :for => "my_for"))
end
@@ -274,6 +278,11 @@ class FormHelperTest < ActionView::TestCase
hidden_field("post", "title", :value => "Something Else")
end
def test_text_field_with_id_as_nil
assert_dom_equal '<input name="post[title]" type="hidden" value="Hello World" />',
hidden_field("post", "title", :id => nil)
end
def test_check_box
assert_dom_equal(
'<input name="post[secret]" type="hidden" value="0" /><input checked="checked" id="post_secret" name="post[secret]" type="checkbox" value="1" />',

View File

@@ -3,6 +3,12 @@ require 'abstract_unit'
class NumberHelperTest < ActionView::TestCase
tests ActionView::Helpers::NumberHelper
def test_number_helpers_escape_delimiter_and_separator
assert_equal "$1&lt;script&gt;&lt;/script&gt;01", number_to_currency(1.01, :separator => "<script></script>")
assert_equal "$1&lt;script&gt;&lt;/script&gt;000.00", number_to_currency(1000, :delimiter => "<script></script>")
assert_equal "&lt;script&gt;1,000.00$&lt;/script&gt;", number_to_currency(1000, :format => "<script>%n%u</script>")
end
def test_number_to_phone
assert_equal("555-1234", number_to_phone(5551234))
assert_equal("800-555-1212", number_to_phone(8005551212))

View File

@@ -9,8 +9,8 @@ module RenderTestCases
# Reload and register danish language for testing
I18n.reload!
I18n.backend.store_translations 'da', {}
I18n.backend.store_translations 'pt-BR', {}
I18n.backend.store_translations 'da', 'da' => {}
I18n.backend.store_translations 'pt-BR', 'pt-BR' => {}
# Ensure original are still the same since we are reindexing view paths
assert_equal ORIGINAL_LOCALES, I18n.available_locales.map(&:to_s).sort

View File

@@ -195,7 +195,9 @@ module ActiveRecord
def log_info(sql, name, ms)
if @logger && @logger.debug?
name = '%s (%.1fms)' % [name || 'SQL', ms]
sql.force_encoding 'binary' if sql.respond_to?(:force_encoding)
if sql.respond_to?(:force_encoding)
sql = sql.dup.force_encoding 'binary'
end
@logger.debug(format_log_entry(name, sql.squeeze(' ')))
end
end
@@ -212,13 +214,7 @@ module ActiveRecord
log_info(sql, name, 0)
nil
end
rescue SystemExit, SignalException, NoMemoryError => e
# Don't re-wrap these exceptions. They are probably not being caused by invalid
# sql, but rather some external stimulus beyond the responsibilty of this code.
# Additionaly, wrapping these exceptions with StatementInvalid would lead to
# meaningful loss of data, such as losing SystemExit#status.
raise e
rescue Exception => e
rescue => e
# Log message and raise exception.
# Set last_verification to 0, so that connection gets verified
# upon reentering the request loop

View File

@@ -1,5 +1,4 @@
require 'active_support/core_ext/kernel/daemonizing'
require 'active_support/core_ext/kernel/reporting'
require 'active_support/core_ext/kernel/agnostics'
require 'active_support/core_ext/kernel/requires'
require 'active_support/core_ext/kernel/debugger'

View File

@@ -1,11 +0,0 @@
class Object
# Makes backticks behave (somewhat more) similarly on all platforms.
# On win32 `nonexistent_command` raises Errno::ENOENT; on Unix, the
# spawned shell prints a message to stderr and sets $?. We emulate
# Unix on the former but not the latter.
def `(command) #:nodoc:
super
rescue Errno::ENOENT => e
STDERR.puts "#$0: #{e}"
end
end

View File

@@ -1,3 +1,6 @@
require 'active_support/core_ext/kernel/singleton_class'
require 'active_support/core_ext/module/aliasing'
module ActiveSupport
module Memoizable
def self.memoized_ivar_for(symbol)
@@ -41,10 +44,10 @@ module ActiveSupport
end
end
def flush_cache(*syms, &block)
def flush_cache(*syms)
syms.each do |sym|
(methods + private_methods + protected_methods).each do |m|
if m.to_s =~ /^_unmemoized_(#{sym})/
if m.to_s =~ /^_unmemoized_(#{sym.to_s.gsub(/\?\Z/, '\?')})/
ivar = ActiveSupport::Memoizable.memoized_ivar_for($1)
instance_variable_get(ivar).clear if instance_variable_defined?(ivar)
end
@@ -69,7 +72,7 @@ module ActiveSupport
if instance_method(:#{symbol}).arity == 0 # if instance_method(:mime_type).arity == 0
def #{symbol}(reload = false) # def mime_type(reload = false)
if reload || !defined?(#{memoized_ivar}) || #{memoized_ivar}.empty? # if reload || !defined?(@_memoized_mime_type) || @_memoized_mime_type.empty?
#{memoized_ivar} = [#{original_method}.freeze] # @_memoized_mime_type = [_unmemoized_mime_type.freeze]
#{memoized_ivar} = [#{original_method}] # @_memoized_mime_type = [_unmemoized_mime_type]
end # end
#{memoized_ivar}[0] # @_memoized_mime_type[0]
end # end
@@ -82,7 +85,7 @@ module ActiveSupport
if !reload && #{memoized_ivar}.has_key?(args) # if !reload && @_memoized_mime_type.has_key?(args)
#{memoized_ivar}[args] # @_memoized_mime_type[args]
elsif #{memoized_ivar} # elsif @_memoized_mime_type
#{memoized_ivar}[args] = #{original_method}(*args).freeze # @_memoized_mime_type[args] = _unmemoized_mime_type(*args).freeze
#{memoized_ivar}[args] = #{original_method}(*args) # @_memoized_mime_type[args] = _unmemoized_mime_type(*args)
end # end
else # else
#{original_method}(*args) # _unmemoized_mime_type(*args)

View File

@@ -1,11 +1,6 @@
# Prefer gems to the bundled libs.
require 'rubygems'
begin
gem 'builder', '~> 2.1.2'
rescue Gem::LoadError
$:.unshift "#{File.dirname(__FILE__)}/vendor/builder-2.1.2"
end
require 'builder'
begin
@@ -14,13 +9,8 @@ rescue Gem::LoadError
$:.unshift "#{File.dirname(__FILE__)}/vendor/memcache-client-1.7.4"
end
$:.unshift "#{File.dirname(__FILE__)}/vendor/tzinfo-0.3.12"
$:.unshift "#{File.dirname(__FILE__)}/vendor/tzinfo-0.3.39/lib"
begin
gem 'i18n', '>= 0.4.1'
rescue Gem::LoadError
$:.unshift "#{File.dirname(__FILE__)}/vendor/i18n-0.4.1"
end
require 'i18n'
module I18n

View File

@@ -1,13 +0,0 @@
#!/usr/bin/env ruby
#--
# Copyright 2004 by Jim Weirich (jim@weirichhouse.org).
# All rights reserved.
# Permission is granted for use, copying, modification, distribution,
# and distribution of modified versions of this work as long as the
# above copyright notice is included.
#++
require 'builder/xmlmarkup'
require 'builder/xmlevents'

View File

@@ -1,248 +0,0 @@
#!/usr/bin/env ruby
#--
# Copyright 2004, 2005 by Jim Weirich (jim@weirichhouse.org).
# Copyright 2005 by Scott Barron (scott@elitists.net).
# All rights reserved.
#
# Permission is granted for use, copying, modification, distribution,
# and distribution of modified versions of this work as long as the
# above copyright notice is included.
#
# Much of this is taken from Jim's work in xmlbase.rb and xmlmarkup.rb.
# Documentation has also been copied and pasted and modified to reflect
# that we're building CSS here instead of XML. Jim is conducting the
# orchestra here and I'm just off in the corner playing a flute.
#++
# Provide a flexible and easy to use Builder for creating Cascading
# Style Sheets (CSS).
module Builder
# Create a Cascading Style Sheet (CSS) using Ruby.
#
# Example usage:
#
# css = Builder::CSS.new
#
# text_color = '#7F7F7F'
# preferred_fonts = 'Helvetica, Arial, sans_serif'
#
# css.comment! 'This is our stylesheet'
# css.body {
# background_color '#FAFAFA'
# font_size 'small'
# font_family preferred_fonts
# color text_color
# }
#
# css.id!('navbar') {
# width '500px'
# }
#
# css.class!('navitem') {
# color 'red'
# }
#
# css.a :hover {
# text_decoration 'underline'
# }
#
# css.div(:id => 'menu') {
# background 'green'
# }
#
# css.div(:class => 'foo') {
# background 'red'
# }
#
# This will yield the following stylesheet:
#
# /* This is our stylesheet */
# body {
# background_color: #FAFAFA;
# font_size: small;
# font_family: Helvetica, Arial, sans_serif;
# color: #7F7F7F;
# }
#
# #navbar {
# width: 500px;
# }
#
# .navitem {
# color: red;
# }
#
# a:hover {
# text_decoration: underline;
# }
#
# div#menu {
# background: green;
# }
#
# div.foo {
# background: red;
# }
#
class CSS < BasicObject
# Create a CSS builder.
#
# out:: Object receiving the markup.1 +out+ must respond to
# <tt><<</tt>.
# indent:: Number of spaces used for indentation (0 implies no
# indentation and no line breaks).
#
def initialize(indent=2)
@indent = indent
@target = []
@parts = []
@library = {}
end
def +(part)
_join_with_op! '+'
self
end
def >>(part)
_join_with_op! ''
self
end
def >(part)
_join_with_op! '>'
self
end
def |(part)
_join_with_op! ','
self
end
# Return the target of the builder
def target!
@target * ''
end
# Create a comment string in the output.
def comment!(comment_text)
@target << "/* #{comment_text} */\n"
end
def id!(arg, &block)
_start_container('#'+arg.to_s, nil, block_given?)
_css_block(block) if block
_unify_block
self
end
def class!(arg, &block)
_start_container('.'+arg.to_s, nil, block_given?)
_css_block(block) if block
_unify_block
self
end
def store!(sym, &block)
@library[sym] = block.to_proc
end
def group!(*args, &block)
args.each do |arg|
if arg.is_a?(::Symbol)
instance_eval(&@library[arg])
else
instance_eval(&arg)
end
_text ', ' unless arg == args.last
end
if block
_css_block(block)
_unify_block
end
end
def method_missing(sym, *args, &block)
sym = "#{sym}:#{args.shift}" if args.first.kind_of?(::Symbol)
if block
_start_container(sym, args.first)
_css_block(block)
_unify_block
elsif @in_block
_indent
_css_line(sym, *args)
_newline
return self
else
_start_container(sym, args.first, false)
_unify_block
end
self
end
# "Cargo culted" from Jim who also "cargo culted" it. See xmlbase.rb.
def nil?
false
end
private
def _unify_block
@target << @parts * ''
@parts = []
end
def _join_with_op!(op)
rhs, lhs = @target.pop, @target.pop
@target << "#{lhs} #{op} #{rhs}"
end
def _text(text)
@parts << text
end
def _css_block(block)
_newline
_nested_structures(block)
_end_container
_end_block
end
def _end_block
_newline
_newline
end
def _newline
_text "\n"
end
def _indent
_text ' ' * @indent
end
def _nested_structures(block)
@in_block = true
self.instance_eval(&block)
@in_block = false
end
def _start_container(sym, atts = {}, with_bracket = true)
selector = sym.to_s
selector << ".#{atts[:class]}" if atts && atts[:class]
selector << '#' + "#{atts[:id]}" if atts && atts[:id]
@parts << "#{selector}#{with_bracket ? ' {' : ''}"
end
def _end_container
@parts << "}"
end
def _css_line(sym, *args)
_text("#{sym.to_s.gsub('_','-')}: #{args * ' '};")
end
end
end

View File

@@ -1,115 +0,0 @@
#!/usr/bin/env ruby
# The XChar library is provided courtesy of Sam Ruby (See
# http://intertwingly.net/stories/2005/09/28/xchar.rb)
# --------------------------------------------------------------------
# If the Builder::XChar module is not currently defined, fail on any
# name clashes in standard library classes.
module Builder
def self.check_for_name_collision(klass, method_name, defined_constant=nil)
if klass.instance_methods.include?(method_name.to_s)
fail RuntimeError,
"Name Collision: Method '#{method_name}' is already defined in #{klass}"
end
end
end
if ! defined?(Builder::XChar)
Builder.check_for_name_collision(String, "to_xs")
Builder.check_for_name_collision(Fixnum, "xchr")
end
######################################################################
module Builder
####################################################################
# XML Character converter, from Sam Ruby:
# (see http://intertwingly.net/stories/2005/09/28/xchar.rb).
#
module XChar # :nodoc:
# See
# http://intertwingly.net/stories/2004/04/14/i18n.html#CleaningWindows
# for details.
CP1252 = { # :nodoc:
128 => 8364, # euro sign
130 => 8218, # single low-9 quotation mark
131 => 402, # latin small letter f with hook
132 => 8222, # double low-9 quotation mark
133 => 8230, # horizontal ellipsis
134 => 8224, # dagger
135 => 8225, # double dagger
136 => 710, # modifier letter circumflex accent
137 => 8240, # per mille sign
138 => 352, # latin capital letter s with caron
139 => 8249, # single left-pointing angle quotation mark
140 => 338, # latin capital ligature oe
142 => 381, # latin capital letter z with caron
145 => 8216, # left single quotation mark
146 => 8217, # right single quotation mark
147 => 8220, # left double quotation mark
148 => 8221, # right double quotation mark
149 => 8226, # bullet
150 => 8211, # en dash
151 => 8212, # em dash
152 => 732, # small tilde
153 => 8482, # trade mark sign
154 => 353, # latin small letter s with caron
155 => 8250, # single right-pointing angle quotation mark
156 => 339, # latin small ligature oe
158 => 382, # latin small letter z with caron
159 => 376, # latin capital letter y with diaeresis
}
# See http://www.w3.org/TR/REC-xml/#dt-chardata for details.
PREDEFINED = {
38 => '&amp;', # ampersand
60 => '&lt;', # left angle bracket
62 => '&gt;', # right angle bracket
}
# See http://www.w3.org/TR/REC-xml/#charsets for details.
VALID = [
0x9, 0xA, 0xD,
(0x20..0xD7FF),
(0xE000..0xFFFD),
(0x10000..0x10FFFF)
]
end
end
######################################################################
# Enhance the Fixnum class with a XML escaped character conversion.
#
class Fixnum
XChar = Builder::XChar if ! defined?(XChar)
# XML escaped version of chr
def xchr
n = XChar::CP1252[self] || self
case n when *XChar::VALID
XChar::PREDEFINED[n] or (n<128 ? n.chr : "&##{n};")
else
'*'
end
end
end
######################################################################
# Enhance the String class with a XML escaped character version of
# to_s.
#
class String
# XML escaped version of to_s
def to_xs
unpack('U*').map {|n| n.xchr}.join # ASCII, UTF-8
rescue
unpack('C*').map {|n| n.xchr}.join # ISO-8859-1, WIN-1252
end
end

View File

@@ -1,137 +0,0 @@
#!/usr/bin/env ruby
module Builder
# Generic error for builder
class IllegalBlockError < RuntimeError; end
# XmlBase is a base class for building XML builders. See
# Builder::XmlMarkup and Builder::XmlEvents for examples.
class XmlBase < BasicObject
# Create an XML markup builder.
#
# out:: Object receiving the markup. +out+ must respond to
# <tt><<</tt>.
# indent:: Number of spaces used for indentation (0 implies no
# indentation and no line breaks).
# initial:: Level of initial indentation.
#
def initialize(indent=0, initial=0)
@indent = indent
@level = initial
end
# Create a tag named +sym+. Other than the first argument which
# is the tag name, the arguments are the same as the tags
# implemented via <tt>method_missing</tt>.
def tag!(sym, *args, &block)
method_missing(sym.to_sym, *args, &block)
end
# Create XML markup based on the name of the method. This method
# is never invoked directly, but is called for each markup method
# in the markup block.
def method_missing(sym, *args, &block)
text = nil
attrs = nil
sym = "#{sym}:#{args.shift}" if args.first.kind_of?(::Symbol)
args.each do |arg|
case arg
when ::Hash
attrs ||= {}
attrs.merge!(arg)
else
text ||= ''
text << arg.to_s
end
end
if block
unless text.nil?
raise ::ArgumentError, "XmlMarkup cannot mix a text argument with a block"
end
_indent
_start_tag(sym, attrs)
_newline
_nested_structures(block)
_indent
_end_tag(sym)
_newline
elsif text.nil?
_indent
_start_tag(sym, attrs, true)
_newline
else
_indent
_start_tag(sym, attrs)
text! text
_end_tag(sym)
_newline
end
@target
end
# Append text to the output target. Escape any markup. May be
# used within the markup brackets as:
#
# builder.p { |b| b.br; b.text! "HI" } #=> <p><br/>HI</p>
def text!(text)
_text(_escape(text))
end
# Append text to the output target without escaping any markup.
# May be used within the markup brackets as:
#
# builder.p { |x| x << "<br/>HI" } #=> <p><br/>HI</p>
#
# This is useful when using non-builder enabled software that
# generates strings. Just insert the string directly into the
# builder without changing the inserted markup.
#
# It is also useful for stacking builder objects. Builders only
# use <tt><<</tt> to append to the target, so by supporting this
# method/operation builders can use other builders as their
# targets.
def <<(text)
_text(text)
end
# For some reason, nil? is sent to the XmlMarkup object. If nil?
# is not defined and method_missing is invoked, some strange kind
# of recursion happens. Since nil? won't ever be an XML tag, it
# is pretty safe to define it here. (Note: this is an example of
# cargo cult programming,
# cf. http://fishbowl.pastiche.org/2004/10/13/cargo_cult_programming).
def nil?
false
end
private
require 'builder/xchar'
def _escape(text)
text.to_xs
end
def _escape_quote(text)
_escape(text).gsub(%r{"}, '&quot;') # " WART
end
def _newline
return if @indent == 0
text! "\n"
end
def _indent
return if @indent == 0 || @level == 0
text!(" " * (@level * @indent))
end
def _nested_structures(block)
@level += 1
block.call(self)
ensure
@level -= 1
end
end
end

View File

@@ -1,63 +0,0 @@
#!/usr/bin/env ruby
#--
# Copyright 2004 by Jim Weirich (jim@weirichhouse.org).
# All rights reserved.
# Permission is granted for use, copying, modification, distribution,
# and distribution of modified versions of this work as long as the
# above copyright notice is included.
#++
require 'builder/xmlmarkup'
module Builder
# Create a series of SAX-like XML events (e.g. start_tag, end_tag)
# from the markup code. XmlEvent objects are used in a way similar
# to XmlMarkup objects, except that a series of events are generated
# and passed to a handler rather than generating character-based
# markup.
#
# Usage:
# xe = Builder::XmlEvents.new(handler)
# xe.title("HI") # Sends start_tag/end_tag/text messages to the handler.
#
# Indentation may also be selected by providing value for the
# indentation size and initial indentation level.
#
# xe = Builder::XmlEvents.new(handler, indent_size, initial_indent_level)
#
# == XML Event Handler
#
# The handler object must expect the following events.
#
# [<tt>start_tag(tag, attrs)</tt>]
# Announces that a new tag has been found. +tag+ is the name of
# the tag and +attrs+ is a hash of attributes for the tag.
#
# [<tt>end_tag(tag)</tt>]
# Announces that an end tag for +tag+ has been found.
#
# [<tt>text(text)</tt>]
# Announces that a string of characters (+text+) has been found.
# A series of characters may be broken up into more than one
# +text+ call, so the client cannot assume that a single
# callback contains all the text data.
#
class XmlEvents < XmlMarkup
def text!(text)
@target.text(text)
end
def _start_tag(sym, attrs, end_too=false)
@target.start_tag(sym, attrs)
_end_tag(sym) if end_too
end
def _end_tag(sym)
@target.end_tag(sym)
end
end
end

View File

@@ -1,328 +0,0 @@
#!/usr/bin/env ruby
#--
# Copyright 2004, 2005 by Jim Weirich (jim@weirichhouse.org).
# All rights reserved.
# Permission is granted for use, copying, modification, distribution,
# and distribution of modified versions of this work as long as the
# above copyright notice is included.
#++
# Provide a flexible and easy to use Builder for creating XML markup.
# See XmlBuilder for usage details.
require 'builder/xmlbase'
module Builder
# Create XML markup easily. All (well, almost all) methods sent to
# an XmlMarkup object will be translated to the equivalent XML
# markup. Any method with a block will be treated as an XML markup
# tag with nested markup in the block.
#
# Examples will demonstrate this easier than words. In the
# following, +xm+ is an +XmlMarkup+ object.
#
# xm.em("emphasized") # => <em>emphasized</em>
# xm.em { xmm.b("emp & bold") } # => <em><b>emph &amp; bold</b></em>
# xm.a("A Link", "href"=>"http://onestepback.org")
# # => <a href="http://onestepback.org">A Link</a>
# xm.div { br } # => <div><br/></div>
# xm.target("name"=>"compile", "option"=>"fast")
# # => <target option="fast" name="compile"\>
# # NOTE: order of attributes is not specified.
#
# xm.instruct! # <?xml version="1.0" encoding="UTF-8"?>
# xm.html { # <html>
# xm.head { # <head>
# xm.title("History") # <title>History</title>
# } # </head>
# xm.body { # <body>
# xm.comment! "HI" # <! -- HI -->
# xm.h1("Header") # <h1>Header</h1>
# xm.p("paragraph") # <p>paragraph</p>
# } # </body>
# } # </html>
#
# == Notes:
#
# * The order that attributes are inserted in markup tags is
# undefined.
#
# * Sometimes you wish to insert text without enclosing tags. Use
# the <tt>text!</tt> method to accomplish this.
#
# Example:
#
# xm.div { # <div>
# xm.text! "line"; xm.br # line<br/>
# xm.text! "another line"; xmbr # another line<br/>
# } # </div>
#
# * The special XML characters <, >, and & are converted to &lt;,
# &gt; and &amp; automatically. Use the <tt><<</tt> operation to
# insert text without modification.
#
# * Sometimes tags use special characters not allowed in ruby
# identifiers. Use the <tt>tag!</tt> method to handle these
# cases.
#
# Example:
#
# xml.tag!("SOAP:Envelope") { ... }
#
# will produce ...
#
# <SOAP:Envelope> ... </SOAP:Envelope>"
#
# <tt>tag!</tt> will also take text and attribute arguments (after
# the tag name) like normal markup methods. (But see the next
# bullet item for a better way to handle XML namespaces).
#
# * Direct support for XML namespaces is now available. If the
# first argument to a tag call is a symbol, it will be joined to
# the tag to produce a namespace:tag combination. It is easier to
# show this than describe it.
#
# xml.SOAP :Envelope do ... end
#
# Just put a space before the colon in a namespace to produce the
# right form for builder (e.g. "<tt>SOAP:Envelope</tt>" =>
# "<tt>xml.SOAP :Envelope</tt>")
#
# * XmlMarkup builds the markup in any object (called a _target_)
# that accepts the <tt><<</tt> method. If no target is given,
# then XmlMarkup defaults to a string target.
#
# Examples:
#
# xm = Builder::XmlMarkup.new
# result = xm.title("yada")
# # result is a string containing the markup.
#
# buffer = ""
# xm = Builder::XmlMarkup.new(buffer)
# # The markup is appended to buffer (using <<)
#
# xm = Builder::XmlMarkup.new(STDOUT)
# # The markup is written to STDOUT (using <<)
#
# xm = Builder::XmlMarkup.new
# x2 = Builder::XmlMarkup.new(:target=>xm)
# # Markup written to +x2+ will be send to +xm+.
#
# * Indentation is enabled by providing the number of spaces to
# indent for each level as a second argument to XmlBuilder.new.
# Initial indentation may be specified using a third parameter.
#
# Example:
#
# xm = Builder.new(:indent=>2)
# # xm will produce nicely formatted and indented XML.
#
# xm = Builder.new(:indent=>2, :margin=>4)
# # xm will produce nicely formatted and indented XML with 2
# # spaces per indent and an over all indentation level of 4.
#
# builder = Builder::XmlMarkup.new(:target=>$stdout, :indent=>2)
# builder.name { |b| b.first("Jim"); b.last("Weirich) }
# # prints:
# # <name>
# # <first>Jim</first>
# # <last>Weirich</last>
# # </name>
#
# * The instance_eval implementation which forces self to refer to
# the message receiver as self is now obsolete. We now use normal
# block calls to execute the markup block. This means that all
# markup methods must now be explicitly send to the xml builder.
# For instance, instead of
#
# xml.div { strong("text") }
#
# you need to write:
#
# xml.div { xml.strong("text") }
#
# Although more verbose, the subtle change in semantics within the
# block was found to be prone to error. To make this change a
# little less cumbersome, the markup block now gets the markup
# object sent as an argument, allowing you to use a shorter alias
# within the block.
#
# For example:
#
# xml_builder = Builder::XmlMarkup.new
# xml_builder.div { |xml|
# xml.stong("text")
# }
#
class XmlMarkup < XmlBase
# Create an XML markup builder. Parameters are specified by an
# option hash.
#
# :target=><em>target_object</em>::
# Object receiving the markup. +out+ must respond to the
# <tt><<</tt> operator. The default is a plain string target.
#
# :indent=><em>indentation</em>::
# Number of spaces used for indentation. The default is no
# indentation and no line breaks.
#
# :margin=><em>initial_indentation_level</em>::
# Amount of initial indentation (specified in levels, not
# spaces).
#
# :escape_attrs=><b>OBSOLETE</em>::
# The :escape_attrs option is no longer supported by builder
# (and will be quietly ignored). String attribute values are
# now automatically escaped. If you need unescaped attribute
# values (perhaps you are using entities in the attribute
# values), then give the value as a Symbol. This allows much
# finer control over escaping attribute values.
#
def initialize(options={})
indent = options[:indent] || 0
margin = options[:margin] || 0
super(indent, margin)
@target = options[:target] || ""
end
# Return the target of the builder.
def target!
@target
end
def comment!(comment_text)
_ensure_no_block ::Kernel.block_given?
_special("<!-- ", " -->", comment_text, nil)
end
# Insert an XML declaration into the XML markup.
#
# For example:
#
# xml.declare! :ELEMENT, :blah, "yada"
# # => <!ELEMENT blah "yada">
def declare!(inst, *args, &block)
_indent
@target << "<!#{inst}"
args.each do |arg|
case arg
when ::String
@target << %{ "#{arg}"} # " WART
when ::Symbol
@target << " #{arg}"
end
end
if ::Kernel.block_given?
@target << " ["
_newline
_nested_structures(block)
@target << "]"
end
@target << ">"
_newline
end
# Insert a processing instruction into the XML markup. E.g.
#
# For example:
#
# xml.instruct!
# #=> <?xml version="1.0" encoding="UTF-8"?>
# xml.instruct! :aaa, :bbb=>"ccc"
# #=> <?aaa bbb="ccc"?>
#
def instruct!(directive_tag=:xml, attrs={})
_ensure_no_block ::Kernel.block_given?
if directive_tag == :xml
a = { :version=>"1.0", :encoding=>"UTF-8" }
attrs = a.merge attrs
end
_special(
"<?#{directive_tag}",
"?>",
nil,
attrs,
[:version, :encoding, :standalone])
end
# Insert a CDATA section into the XML markup.
#
# For example:
#
# xml.cdata!("text to be included in cdata")
# #=> <![CDATA[text to be included in cdata]]>
#
def cdata!(text)
_ensure_no_block ::Kernel.block_given?
_special("<![CDATA[", "]]>", text, nil)
end
private
# NOTE: All private methods of a builder object are prefixed when
# a "_" character to avoid possible conflict with XML tag names.
# Insert text directly in to the builder's target.
def _text(text)
@target << text
end
# Insert special instruction.
def _special(open, close, data=nil, attrs=nil, order=[])
_indent
@target << open
@target << data if data
_insert_attributes(attrs, order) if attrs
@target << close
_newline
end
# Start an XML tag. If <tt>end_too</tt> is true, then the start
# tag is also the end tag (e.g. <br/>
def _start_tag(sym, attrs, end_too=false)
@target << "<#{sym}"
_insert_attributes(attrs)
@target << "/" if end_too
@target << ">"
end
# Insert an ending tag.
def _end_tag(sym)
@target << "</#{sym}>"
end
# Insert the attributes (given in the hash).
def _insert_attributes(attrs, order=[])
return if attrs.nil?
order.each do |k|
v = attrs[k]
@target << %{ #{k}="#{_attr_value(v)}"} if v # " WART
end
attrs.each do |k, v|
@target << %{ #{k}="#{_attr_value(v)}"} unless order.member?(k) # " WART
end
end
def _attr_value(value)
case value
when ::Symbol
value.to_s
else
_escape_quote(value.to_s)
end
end
def _ensure_no_block(got_block)
if got_block
fail IllegalBlockError,
"Blocks are not allowed on XML instructions"
end
end
end
end

View File

@@ -1,322 +0,0 @@
# encoding: utf-8
# Authors:: Sven Fuchs (http://www.artweb-design.de),
# Joshua Harvey (http://www.workingwithrails.com/person/759-joshua-harvey),
# Stephan Soller (http://www.arkanis-development.de/),
# Saimon Moore (http://saimonmoore.net),
# Matt Aimonetti (http://railsontherun.com/)
# Copyright:: Copyright (c) 2008 The Ruby i18n Team
# License:: MIT
require 'i18n/exceptions'
require 'i18n/core_ext/string/interpolate'
module I18n
autoload :Backend, 'i18n/backend'
autoload :Config, 'i18n/config'
autoload :Gettext, 'i18n/gettext'
autoload :Locale, 'i18n/locale'
class << self
# Gets I18n configuration object.
def config
Thread.current[:i18n_config] ||= I18n::Config.new
end
# Sets I18n configuration object.
def config=(value)
Thread.current[:i18n_config] = value
end
# Write methods which delegates to the configuration object
%w(locale backend default_locale available_locales default_separator
exception_handler load_path).each do |method|
module_eval <<-DELEGATORS, __FILE__, __LINE__ + 1
def #{method}
config.#{method}
end
def #{method}=(value)
config.#{method} = (value)
end
DELEGATORS
end
# Tells the backend to reload translations. Used in situations like the
# Rails development environment. Backends can implement whatever strategy
# is useful.
def reload!
config.backend.reload!
end
# Translates, pluralizes and interpolates a given key using a given locale,
# scope, and default, as well as interpolation values.
#
# *LOOKUP*
#
# Translation data is organized as a nested hash using the upper-level keys
# as namespaces. <em>E.g.</em>, ActionView ships with the translation:
# <tt>:date => {:formats => {:short => "%b %d"}}</tt>.
#
# Translations can be looked up at any level of this hash using the key argument
# and the scope option. <em>E.g.</em>, in this example <tt>I18n.t :date</tt>
# returns the whole translations hash <tt>{:formats => {:short => "%b %d"}}</tt>.
#
# Key can be either a single key or a dot-separated key (both Strings and Symbols
# work). <em>E.g.</em>, the short format can be looked up using both:
# I18n.t 'date.formats.short'
# I18n.t :'date.formats.short'
#
# Scope can be either a single key, a dot-separated key or an array of keys
# or dot-separated keys. Keys and scopes can be combined freely. So these
# examples will all look up the same short date format:
# I18n.t 'date.formats.short'
# I18n.t 'formats.short', :scope => 'date'
# I18n.t 'short', :scope => 'date.formats'
# I18n.t 'short', :scope => %w(date formats)
#
# *INTERPOLATION*
#
# Translations can contain interpolation variables which will be replaced by
# values passed to #translate as part of the options hash, with the keys matching
# the interpolation variable names.
#
# <em>E.g.</em>, with a translation <tt>:foo => "foo %{bar}"</tt> the option
# value for the key +bar+ will be interpolated into the translation:
# I18n.t :foo, :bar => 'baz' # => 'foo baz'
#
# *PLURALIZATION*
#
# Translation data can contain pluralized translations. Pluralized translations
# are arrays of singluar/plural versions of translations like <tt>['Foo', 'Foos']</tt>.
#
# Note that <tt>I18n::Backend::Simple</tt> only supports an algorithm for English
# pluralization rules. Other algorithms can be supported by custom backends.
#
# This returns the singular version of a pluralized translation:
# I18n.t :foo, :count => 1 # => 'Foo'
#
# These both return the plural version of a pluralized translation:
# I18n.t :foo, :count => 0 # => 'Foos'
# I18n.t :foo, :count => 2 # => 'Foos'
#
# The <tt>:count</tt> option can be used both for pluralization and interpolation.
# <em>E.g.</em>, with the translation
# <tt>:foo => ['%{count} foo', '%{count} foos']</tt>, count will
# be interpolated to the pluralized translation:
# I18n.t :foo, :count => 1 # => '1 foo'
#
# *DEFAULTS*
#
# This returns the translation for <tt>:foo</tt> or <tt>default</tt> if no translation was found:
# I18n.t :foo, :default => 'default'
#
# This returns the translation for <tt>:foo</tt> or the translation for <tt>:bar</tt> if no
# translation for <tt>:foo</tt> was found:
# I18n.t :foo, :default => :bar
#
# Returns the translation for <tt>:foo</tt> or the translation for <tt>:bar</tt>
# or <tt>default</tt> if no translations for <tt>:foo</tt> and <tt>:bar</tt> were found.
# I18n.t :foo, :default => [:bar, 'default']
#
# *BULK LOOKUP*
#
# This returns an array with the translations for <tt>:foo</tt> and <tt>:bar</tt>.
# I18n.t [:foo, :bar]
#
# Can be used with dot-separated nested keys:
# I18n.t [:'baz.foo', :'baz.bar']
#
# Which is the same as using a scope option:
# I18n.t [:foo, :bar], :scope => :baz
#
# *LAMBDAS*
#
# Both translations and defaults can be given as Ruby lambdas. Lambdas will be
# called and passed the key and options.
#
# E.g. assuming the key <tt>:salutation</tt> resolves to:
# lambda { |key, options| options[:gender] == 'm' ? "Mr. %{options[:name]}" : "Mrs. %{options[:name]}" }
#
# Then <tt>I18n.t(:salutation, :gender => 'w', :name => 'Smith') will result in "Mrs. Smith".
#
# It is recommended to use/implement lambdas in an "idempotent" way. E.g. when
# a cache layer is put in front of I18n.translate it will generate a cache key
# from the argument values passed to #translate. Therefor your lambdas should
# always return the same translations/values per unique combination of argument
# values.
def translate(*args)
options = args.pop if args.last.is_a?(Hash)
key = args.shift
locale = options && options.delete(:locale) || config.locale
raises = options && options.delete(:raise)
config.backend.translate(locale, key, options || {})
rescue I18n::ArgumentError => exception
raise exception if raises
handle_exception(exception, locale, key, options)
end
alias :t :translate
def translate!(key, options = {})
translate(key, options.merge( :raise => true ))
end
alias :t! :translate!
# Transliterates UTF-8 characters to ASCII. By default this method will
# transliterate only Latin strings to an ASCII approximation:
#
# I18n.transliterate("Ærøskøbing")
# # => "AEroskobing"
#
# I18n.transliterate("日本語")
# # => "???"
#
# It's also possible to add support for per-locale transliterations. I18n
# expects transliteration rules to be stored at
# <tt>i18n.transliterate.rule</tt>.
#
# Transliteration rules can either be a Hash or a Proc. Procs must accept a
# single string argument. Hash rules inherit the default transliteration
# rules, while Procs do not.
#
# *Examples*
#
# Setting a Hash in <locale>.yml:
#
# i18n:
# transliterate:
# rule:
# ü: "ue"
# ö: "oe"
#
# Setting a Hash using Ruby:
#
# store_translations(:de, :i18n => {
# :transliterate => {
# :rule => {
# "ü" => "ue",
# "ö" => "oe"
# }
# }
# )
#
# Setting a Proc:
#
# translit = lambda {|string| MyTransliterator.transliterate(string) }
# store_translations(:xx, :i18n => {:transliterate => {:rule => translit})
#
# Transliterating strings:
#
# I18n.locale = :en
# I18n.transliterate("Jürgen") # => "Jurgen"
# I18n.locale = :de
# I18n.transliterate("Jürgen") # => "Juergen"
# I18n.transliterate("Jürgen", :locale => :en) # => "Jurgen"
# I18n.transliterate("Jürgen", :locale => :de) # => "Juergen"
def transliterate(*args)
options = args.pop if args.last.is_a?(Hash)
key = args.shift
locale = options && options.delete(:locale) || config.locale
raises = options && options.delete(:raise)
replacement = options && options.delete(:replacement)
config.backend.transliterate(locale, key, replacement)
rescue I18n::ArgumentError => exception
raise exception if raises
handle_exception(exception, locale, key, options)
end
# Localizes certain objects, such as dates and numbers to local formatting.
def localize(object, options = {})
locale = options.delete(:locale) || config.locale
format = options.delete(:format) || :default
config.backend.localize(locale, object, format, options)
end
alias :l :localize
# Executes block with given I18n.locale set.
def with_locale(tmp_locale = nil)
if tmp_locale
current_locale = self.locale
self.locale = tmp_locale
end
yield
ensure
self.locale = current_locale if tmp_locale
end
# Merges the given locale, key and scope into a single array of keys.
# Splits keys that contain dots into multiple keys. Makes sure all
# keys are Symbols.
def normalize_keys(locale, key, scope, separator = nil)
separator ||= I18n.default_separator
keys = []
keys.concat normalize_key(locale, separator)
keys.concat normalize_key(scope, separator)
keys.concat normalize_key(key, separator)
keys
end
# making these private until Ruby 1.9.2 can send to protected methods again
# see http://redmine.ruby-lang.org/repositories/revision/ruby-19?rev=24280
private
# Handles exceptions raised in the backend. All exceptions except for
# MissingTranslationData exceptions are re-raised. When a MissingTranslationData
# was caught and the option :raise is not set the handler returns an error
# message string containing the key/scope.
def default_exception_handler(exception, locale, key, options)
return exception.message if MissingTranslationData === exception
raise exception
end
# Any exceptions thrown in translate will be sent to the @@exception_handler
# which can be a Symbol, a Proc or any other Object.
#
# If exception_handler is a Symbol then it will simply be sent to I18n as
# a method call. A Proc will simply be called. In any other case the
# method #call will be called on the exception_handler object.
#
# Examples:
#
# I18n.exception_handler = :default_exception_handler # this is the default
# I18n.default_exception_handler(exception, locale, key, options) # will be called like this
#
# I18n.exception_handler = lambda { |*args| ... } # a lambda
# I18n.exception_handler.call(exception, locale, key, options) # will be called like this
#
# I18n.exception_handler = I18nExceptionHandler.new # an object
# I18n.exception_handler.call(exception, locale, key, options) # will be called like this
def handle_exception(exception, locale, key, options)
case config.exception_handler
when Symbol
send(config.exception_handler, exception, locale, key, options)
else
config.exception_handler.call(exception, locale, key, options)
end
end
# Deprecated. Will raise a warning in future versions and then finally be
# removed. Use I18n.normalize_keys instead.
def normalize_translation_keys(locale, key, scope, separator = nil)
normalize_keys(locale, key, scope, separator)
end
def normalize_key(key, separator)
normalized_key_cache[separator][key] ||=
case key
when Array
key.map { |k| normalize_key(k, separator) }.flatten
else
keys = key.to_s.split(separator)
keys.delete('')
keys.map!{ |k| k.to_sym }
keys
end
end
def normalized_key_cache
@normalized_key_cache ||= Hash.new { |h,k| h[k] = {} }
end
end
end

View File

@@ -1,20 +0,0 @@
module I18n
module Backend
autoload :ActiveRecord, 'i18n/backend/active_record'
autoload :Base, 'i18n/backend/base'
autoload :InterpolationCompiler, 'i18n/backend/interpolation_compiler'
autoload :Cache, 'i18n/backend/cache'
autoload :Cascade, 'i18n/backend/cascade'
autoload :Chain, 'i18n/backend/chain'
autoload :Cldr, 'i18n/backend/cldr'
autoload :Fallbacks, 'i18n/backend/fallbacks'
autoload :Flatten, 'i18n/backend/flatten'
autoload :Gettext, 'i18n/backend/gettext'
autoload :KeyValue, 'i18n/backend/key_value'
autoload :Memoize, 'i18n/backend/memoize'
autoload :Metadata, 'i18n/backend/metadata'
autoload :Pluralization, 'i18n/backend/pluralization'
autoload :Simple, 'i18n/backend/simple'
autoload :Transliterator, 'i18n/backend/transliterator'
end
end

View File

@@ -1,61 +0,0 @@
require 'i18n/backend/base'
require 'i18n/backend/active_record/translation'
module I18n
module Backend
class ActiveRecord
autoload :Missing, 'i18n/backend/active_record/missing'
autoload :StoreProcs, 'i18n/backend/active_record/store_procs'
autoload :Translation, 'i18n/backend/active_record/translation'
module Implementation
include Base, Flatten
def available_locales
begin
Translation.available_locales
rescue ::ActiveRecord::StatementInvalid
[]
end
end
def store_translations(locale, data, options = {})
escape = options.fetch(:escape, true)
flatten_translations(locale, data, escape, false).each do |key, value|
Translation.locale(locale).lookup(expand_keys(key)).delete_all
Translation.create(:locale => locale.to_s, :key => key.to_s, :value => value)
end
end
protected
def lookup(locale, key, scope = [], options = {})
key = normalize_flat_keys(locale, key, scope, options[:separator])
result = Translation.locale(locale).lookup(key).all
if result.empty?
nil
elsif result.first.key == key
result.first.value
else
chop_range = (key.size + FLATTEN_SEPARATOR.size)..-1
result = result.inject({}) do |hash, r|
hash[r.key.slice(chop_range)] = r.value
hash
end
result.deep_symbolize_keys
end
end
# For a key :'foo.bar.baz' return ['foo', 'foo.bar', 'foo.bar.baz']
def expand_keys(key)
key.to_s.split(FLATTEN_SEPARATOR).inject([]) do |keys, key|
keys << [keys.last, key].compact.join(FLATTEN_SEPARATOR)
end
end
end
include Implementation
end
end
end

View File

@@ -1,65 +0,0 @@
# This extension stores translation stub records for missing translations to
# the database.
#
# This is useful if you have a web based translation tool. It will populate
# the database with untranslated keys as the application is being used. A
# translator can then go through these and add missing translations.
#
# Example usage:
#
# I18n::Backend::Chain.send(:include, I18n::Backend::ActiveRecord::Missing)
# I18n.backend = I18nChainBackend.new(I18n::Backend::ActiveRecord.new, I18n::Backend::Simple.new)
#
# Stub records for pluralizations will also be created for each key defined
# in i18n.plural.keys.
#
# For example:
#
# # en.yml
# en:
# i18n:
# plural:
# keys: [:zero, :one, :other]
#
# # pl.yml
# pl:
# i18n:
# plural:
# keys: [:zero, :one, :few, :other]
#
# It will also persist interpolation keys in Translation#interpolations so
# translators will be able to review and use them.
module I18n
module Backend
class ActiveRecord
module Missing
def store_default_translations(locale, key, options = {})
count, scope, default, separator = options.values_at(:count, *Base::RESERVED_KEYS)
separator ||= I18n.default_separator
keys = I18n.normalize_keys(locale, key, scope, separator)[1..-1]
key = keys.join(separator || I18n.default_separator)
unless ActiveRecord::Translation.locale(locale).lookup(key).exists?
interpolations = options.reject { |name, value| Base::RESERVED_KEYS.include?(name) }.keys
keys = count ? I18n.t('i18n.plural.keys', :locale => locale).map { |k| [key, k].join(separator) } : [key]
keys.each { |key| store_default_translation(locale, key, interpolations) }
end
end
def store_default_translation(locale, key, interpolations)
translation = ActiveRecord::Translation.new :locale => locale.to_s, :key => key
translation.interpolations = interpolations
translation.save
end
def translate(locale, key, options = {})
super
rescue I18n::MissingTranslationData => e
self.store_default_translations(locale, key, options)
raise e
end
end
end
end
end

View File

@@ -1,38 +0,0 @@
# This module is intended to be mixed into the ActiveRecord backend to allow
# storing Ruby Procs as translation values in the database.
#
# I18n.backend = I18n::Backend::ActiveRecord.new
# I18n::Backend::ActiveRecord::Translation.send(:include, I18n::Backend::ActiveRecord::StoreProcs)
#
# The StoreProcs module requires the ParseTree and ruby2ruby gems and therefor
# was extracted from the original backend.
#
# ParseTree is not compatible with Ruby 1.9.
begin
require 'ruby2ruby'
require 'parse_tree'
require 'parse_tree_extensions'
rescue LoadError => e
puts "can't use StoreProcs because: #{e.message}"
end
module I18n
module Backend
class ActiveRecord
module StoreProcs
def value=(v)
case v
when Proc
write_attribute(:value, v.to_ruby)
write_attribute(:is_proc, true)
else
write_attribute(:value, v)
end
end
Translation.send(:include, self) if method(:to_s).respond_to?(:to_ruby)
end
end
end
end

View File

@@ -1,93 +0,0 @@
require 'active_record'
module I18n
module Backend
# ActiveRecord model used to store actual translations to the database.
#
# This model expects a table like the following to be already set up in
# your the database:
#
# create_table :translations do |t|
# t.string :locale
# t.string :key
# t.text :value
# t.text :interpolations
# t.boolean :is_proc, :default => false
# end
#
# This model supports to named scopes :locale and :lookup. The :locale
# scope simply adds a condition for a given locale:
#
# I18n::Backend::ActiveRecord::Translation.locale(:en).all
# # => all translation records that belong to the :en locale
#
# The :lookup scope adds a condition for looking up all translations
# that either start with the given keys (joined by an optionally given
# separator or I18n.default_separator) or that exactly have this key.
#
# # with translations present for :"foo.bar" and :"foo.baz"
# I18n::Backend::ActiveRecord::Translation.lookup(:foo)
# # => an array with both translation records :"foo.bar" and :"foo.baz"
#
# I18n::Backend::ActiveRecord::Translation.lookup([:foo, :bar])
# I18n::Backend::ActiveRecord::Translation.lookup(:"foo.bar")
# # => an array with the translation record :"foo.bar"
#
# When the StoreProcs module was mixed into this model then Procs will
# be stored to the database as Ruby code and evaluated when :value is
# called.
#
# Translation = I18n::Backend::ActiveRecord::Translation
# Translation.create \
# :locale => 'en'
# :key => 'foo'
# :value => lambda { |key, options| 'FOO' }
# Translation.find_by_locale_and_key('en', 'foo').value
# # => 'FOO'
class ActiveRecord
class Translation < ::ActiveRecord::Base
set_table_name 'translations'
attr_protected :is_proc, :interpolations
serialize :value
serialize :interpolations, Array
scope_method = ::ActiveRecord::VERSION::MAJOR == 2 ? :named_scope : :scope
send scope_method, :locale, lambda { |locale|
{ :conditions => { :locale => locale.to_s } }
}
send scope_method, :lookup, lambda { |keys, *separator|
column_name = connection.quote_column_name('key')
keys = Array(keys).map! { |key| key.to_s }
unless separator.empty?
warn "[DEPRECATION] Giving a separator to Translation.lookup is deprecated. " <<
"You can change the internal separator by overwriting FLATTEN_SEPARATOR."
end
namespace = "#{keys.last}#{I18n::Backend::Flatten::FLATTEN_SEPARATOR}%"
{ :conditions => ["#{column_name} IN (?) OR #{column_name} LIKE ?", keys, namespace] }
}
def self.available_locales
Translation.find(:all, :select => 'DISTINCT locale').map { |t| t.locale.to_sym }
end
def interpolates?(key)
self.interpolations.include?(key) if self.interpolations
end
def value
if is_proc
Kernel.eval(read_attribute(:value))
else
value = read_attribute(:value)
value == 'f' ? false : value
end
end
end
end
end
end

View File

@@ -1,237 +0,0 @@
# encoding: utf-8
require 'yaml'
require 'i18n/core_ext/hash'
module I18n
module Backend
module Base
include I18n::Backend::Transliterator
RESERVED_KEYS = [:scope, :default, :separator, :resolve]
RESERVED_KEYS_PATTERN = /%\{(#{RESERVED_KEYS.join("|")})\}/
DEPRECATED_INTERPOLATION_SYNTAX_PATTERN = /(\\)?\{\{([^\}]+)\}\}/
INTERPOLATION_SYNTAX_PATTERN = /%\{([^\}]+)\}/
# Accepts a list of paths to translation files. Loads translations from
# plain Ruby (*.rb) or YAML files (*.yml). See #load_rb and #load_yml
# for details.
def load_translations(*filenames)
filenames = I18n.load_path.flatten if filenames.empty?
filenames.each { |filename| load_file(filename) }
end
# This method receives a locale, a data hash and options for storing translations.
# Should be implemented
def store_translations(locale, data, options = {})
raise NotImplementedError
end
def translate(locale, key, options = {})
raise InvalidLocale.new(locale) unless locale
return key.map { |k| translate(locale, k, options) } if key.is_a?(Array)
entry = key && lookup(locale, key, options[:scope], options)
if options.empty?
entry = resolve(locale, key, entry, options)
else
count, default = options.values_at(:count, :default)
values = options.except(*RESERVED_KEYS)
entry = entry.nil? && default ?
default(locale, key, default, options) : resolve(locale, key, entry, options)
end
raise(I18n::MissingTranslationData.new(locale, key, options)) if entry.nil?
entry = entry.dup if entry.is_a?(String)
entry = pluralize(locale, entry, count) if count
entry = interpolate(locale, entry, values) if values
entry
end
# Acts the same as +strftime+, but uses a localized version of the
# format string. Takes a key from the date/time formats translations as
# a format argument (<em>e.g.</em>, <tt>:short</tt> in <tt>:'date.formats'</tt>).
def localize(locale, object, format = :default, options = {})
raise ArgumentError, "Object must be a Date, DateTime or Time object. #{object.inspect} given." unless object.respond_to?(:strftime)
if Symbol === format
key = format
type = object.respond_to?(:sec) ? 'time' : 'date'
format = I18n.t(:"#{type}.formats.#{key}", options.merge(:raise => true, :object => object, :locale => locale))
end
# format = resolve(locale, object, format, options)
format = format.to_s.gsub(/%[aAbBp]/) do |match|
case match
when '%a' then I18n.t(:"date.abbr_day_names", :locale => locale, :format => format)[object.wday]
when '%A' then I18n.t(:"date.day_names", :locale => locale, :format => format)[object.wday]
when '%b' then I18n.t(:"date.abbr_month_names", :locale => locale, :format => format)[object.mon]
when '%B' then I18n.t(:"date.month_names", :locale => locale, :format => format)[object.mon]
when '%p' then I18n.t(:"time.#{object.hour < 12 ? :am : :pm}", :locale => locale, :format => format) if object.respond_to? :hour
end
end
object.strftime(format)
end
# Returns an array of locales for which translations are available
# ignoring the reserved translation meta data key :i18n.
def available_locales
raise NotImplementedError
end
def reload!
@skip_syntax_deprecation = false
end
protected
# The method which actually looks up for the translation in the store.
def lookup(locale, key, scope = [], options = {})
raise NotImplementedError
end
# Evaluates defaults.
# If given subject is an Array, it walks the array and returns the
# first translation that can be resolved. Otherwise it tries to resolve
# the translation directly.
def default(locale, object, subject, options = {})
options = options.dup.reject { |key, value| key == :default }
case subject
when Array
subject.each do |item|
result = resolve(locale, object, item, options) and return result
end and nil
else
resolve(locale, object, subject, options)
end
end
# Resolves a translation.
# If the given subject is a Symbol, it will be translated with the
# given options. If it is a Proc then it will be evaluated. All other
# subjects will be returned directly.
def resolve(locale, object, subject, options = nil)
return subject if options[:resolve] == false
case subject
when Symbol
I18n.translate(subject, (options || {}).merge(:locale => locale, :raise => true))
when Proc
date_or_time = options.delete(:object) || object
resolve(locale, object, subject.call(date_or_time, options), options = {})
else
subject
end
rescue MissingTranslationData
nil
end
# Picks a translation from an array according to English pluralization
# rules. It will pick the first translation if count is not equal to 1
# and the second translation if it is equal to 1. Other backends can
# implement more flexible or complex pluralization rules.
def pluralize(locale, entry, count)
return entry unless entry.is_a?(Hash) && count
key = :zero if count == 0 && entry.has_key?(:zero)
key ||= count == 1 ? :one : :other
raise InvalidPluralizationData.new(entry, count) unless entry.has_key?(key)
entry[key]
end
# Interpolates values into a given string.
#
# interpolate "file %{file} opened by %%{user}", :file => 'test.txt', :user => 'Mr. X'
# # => "file test.txt opened by %{user}"
#
# Note that you have to double escape the <tt>\\</tt> when you want to escape
# the <tt>{{...}}</tt> key in a string (once for the string and once for the
# interpolation).
def interpolate(locale, string, values = {})
return string unless string.is_a?(::String) && !values.empty?
original_values = values.dup
preserve_encoding(string) do
string = string.gsub(DEPRECATED_INTERPOLATION_SYNTAX_PATTERN) do
escaped, key = $1, $2.to_sym
if escaped
"{{#{key}}}"
else
warn_syntax_deprecation!
"%{#{key}}"
end
end
keys = string.scan(INTERPOLATION_SYNTAX_PATTERN).flatten
return string if keys.empty?
values.each do |key, value|
if keys.include?(key.to_s)
value = value.call(values) if interpolate_lambda?(value, string, key)
value = value.to_s unless value.is_a?(::String)
values[key] = value
else
values.delete(key)
end
end
string % values
end
rescue KeyError => e
if string =~ RESERVED_KEYS_PATTERN
raise ReservedInterpolationKey.new($1.to_sym, string)
else
raise MissingInterpolationArgument.new(original_values, string)
end
end
def preserve_encoding(string)
if string.respond_to?(:encoding)
encoding = string.encoding
result = yield
result.force_encoding(encoding) if result.respond_to?(:force_encoding)
result
else
yield
end
end
# returns true when the given value responds to :call and the key is
# an interpolation placeholder in the given string
def interpolate_lambda?(object, string, key)
object.respond_to?(:call) && string =~ /%\{#{key}\}|%\<#{key}>.*?\d*\.?\d*[bBdiouxXeEfgGcps]\}/
end
# Loads a single translations file by delegating to #load_rb or
# #load_yml depending on the file extension and directly merges the
# data to the existing translations. Raises I18n::UnknownFileType
# for all other file extensions.
def load_file(filename)
type = File.extname(filename).tr('.', '').downcase
raise UnknownFileType.new(type, filename) unless respond_to?(:"load_#{type}", true)
data = send(:"load_#{type}", filename) # TODO raise a meaningful exception if this does not yield a Hash
data.each { |locale, d| store_translations(locale, d) }
end
# Loads a plain Ruby translations file. eval'ing the file must yield
# a Hash containing translation data with locales as toplevel keys.
def load_rb(filename)
eval(IO.read(filename), binding, filename)
end
# Loads a YAML translations file. The data must have locales as
# toplevel keys.
def load_yml(filename)
YAML::load(IO.read(filename))
end
def warn_syntax_deprecation! #:nodoc:
return if @skip_syntax_deprecation
warn "The {{key}} interpolation syntax in I18n messages is deprecated. Please use %{key} instead.\n#{caller.join("\n")}"
@skip_syntax_deprecation = true
end
end
end
end

View File

@@ -1,77 +0,0 @@
# encoding: utf-8
# This module allows you to easily cache all responses from the backend - thus
# speeding up the I18n aspects of your application quite a bit.
#
# To enable caching you can simply include the Cache module to the Simple
# backend - or whatever other backend you are using:
#
# I18n::Backend::Simple.send(:include, I18n::Backend::Cache)
#
# You will also need to set a cache store implementation that you want to use:
#
# I18n.cache_store = ActiveSupport::Cache.lookup_store(:memory_store)
#
# You can use any cache implementation you want that provides the same API as
# ActiveSupport::Cache (only the methods #fetch and #write are being used).
#
# The cache_key implementation assumes that you only pass values to
# I18n.translate that return a valid key from #hash (see
# http://www.ruby-doc.org/core/classes/Object.html#M000337).
module I18n
class << self
@@cache_store = nil
@@cache_namespace = nil
def cache_store
@@cache_store
end
def cache_store=(store)
@@cache_store = store
end
def cache_namespace
@@cache_namespace
end
def cache_namespace=(namespace)
@@cache_namespace = namespace
end
def perform_caching?
!cache_store.nil?
end
end
module Backend
# TODO Should the cache be cleared if new translations are stored?
module Cache
def translate(*args)
I18n.perform_caching? ? fetch(*args) { super } : super
end
protected
def fetch(*args, &block)
result = I18n.cache_store.fetch(cache_key(*args), &block)
raise result if result.is_a?(Exception)
result = result.dup if result.frozen? rescue result
result
rescue MissingTranslationData => exception
I18n.cache_store.write(cache_key(*args), exception)
raise exception
end
def cache_key(*args)
# This assumes that only simple, native Ruby values are passed to I18n.translate.
# Also, in Ruby < 1.8.7 {}.hash != {}.hash
# (see http://paulbarry.com/articles/2009/09/14/why-rails-3-will-require-ruby-1-8-7)
# If args.inspect does not work for you for some reason, patches are very welcome :)
hash = RUBY_VERSION >= "1.8.7" ? args.hash : args.inspect
keys = ['i18n', I18n.cache_namespace, hash]
keys.compact.join('-')
end
end
end
end

View File

@@ -1,57 +0,0 @@
# encoding: utf-8
# EXPERIMENTAL
#
# The Cascade module adds the ability to do cascading lookups to backends that
# are compatible to the Simple backend.
#
# By cascading lookups we mean that for any key that can not be found the
# Cascade module strips one segment off the scope part of the key and then
# tries to look up the key in that scope.
#
# E.g. when a lookup for the key :"foo.bar.baz" does not yield a result then
# the segment :bar will be stripped off the scope part :"foo.bar" and the new
# scope :foo will be used to look up the key :baz. If that does not succeed
# then the remaining scope segment :foo will be omitted, too, and again the
# key :baz will be looked up (now with no scope).
#
# To enable a cascading lookup one passes the :cascade option:
#
# I18n.t(:'foo.bar.baz', :cascade => true)
#
# This will return the first translation found for :"foo.bar.baz", :"foo.baz"
# or :baz in this order.
#
# The cascading lookup takes precedence over resolving any given defaults.
# I.e. defaults will kick in after the cascading lookups haven't succeeded.
#
# This behavior is useful for libraries like ActiveRecord validations where
# the library wants to give users a bunch of more or less fine-grained options
# of scopes for a particular key.
#
# Thanks to Clemens Kofler for the initial idea and implementation! See
# http://github.com/clemens/i18n-cascading-backend
module I18n
module Backend
module Cascade
def lookup(locale, key, scope = [], options = {})
return super unless cascade = options[:cascade]
separator = options[:separator] || I18n.default_separator
skip_root = cascade.has_key?(:skip_root) ? cascade[:skip_root] : true
step = cascade[:step]
keys = I18n.normalize_keys(nil, key, nil, separator)
offset = options[:cascade][:offset] || keys.length
scope = I18n.normalize_keys(nil, nil, scope, separator) + keys
key = scope.slice!(-offset, offset).join(separator)
begin
result = super
return result unless result.nil?
end while !scope.empty? && scope.slice!(-step, step) && (!scope.empty? || !skip_root)
end
end
end
end

View File

@@ -1,77 +0,0 @@
# encoding: utf-8
module I18n
module Backend
# Backend that chains multiple other backends and checks each of them when
# a translation needs to be looked up. This is useful when you want to use
# standard translations with a Simple backend but store custom application
# translations in a database or other backends.
#
# To use the Chain backend instantiate it and set it to the I18n module.
# You can add chained backends through the initializer or backends
# accessor:
#
# # preserves the existing Simple backend set to I18n.backend
# I18n.backend = I18n::Backend::Chain.new(I18n::Backend::ActiveRecord.new, I18n.backend)
#
# The implementation assumes that all backends added to the Chain implement
# a lookup method with the same API as Simple backend does.
class Chain
include Base
attr_accessor :backends
def initialize(*backends)
self.backends = backends
end
def reload!
backends.each { |backend| backend.reload! }
end
def store_translations(locale, data, options = {})
backends.first.store_translations(locale, data, options = {})
end
def available_locales
backends.map { |backend| backend.available_locales }.flatten.uniq
end
def translate(locale, key, options = {})
return key.map { |k| translate(locale, k, options) } if key.is_a?(Array)
default = options.delete(:default)
namespace = {}
backends.each do |backend|
begin
options.update(:default => default) if default and backend == backends.last
translation = backend.translate(locale, key, options)
if namespace_lookup?(translation, options)
namespace.update(translation)
elsif !translation.nil?
return translation
end
rescue MissingTranslationData
end
end
return namespace unless namespace.empty?
raise(I18n::MissingTranslationData.new(locale, key, options))
end
def localize(locale, object, format = :default, options = {})
backends.each do |backend|
begin
result = backend.localize(locale, object, format, options) and return result
rescue MissingTranslationData
end
end
raise(I18n::MissingTranslationData.new(locale, format, options))
end
protected
def namespace_lookup?(result, options)
result.is_a?(Hash) and not options.has_key?(:count)
end
end
end
end

View File

@@ -1,100 +0,0 @@
# encoding: utf-8
require 'cldr'
module I18n
module Backend
module Cldr
include ::Cldr::Format
def localize(locale, object, format = :default, options = {})
options[:as] ||= detect_type(object, options)
send(:"format_#{options[:as]}", locale, object, format, options)
end
def format_decimal(locale, object, format = :default, options = {})
formatter(locale, :decimal, format).apply(object, options)
end
def format_integer(locale, object, format = :default, options = {})
format_object(number, options.merge(:precision => 0))
end
def format_currency(locale, object, format = :default, options = {})
options.merge!(:currency => lookup_currency(locale, options[:currency], object)) if options[:currency].is_a?(Symbol)
formatter(locale, :currency, format).apply(object, options)
end
def format_percent(locale, object, format = :default, options = {})
formatter(locale, :percent, format).apply(object, options)
end
def format_date(locale, object, format = :default, options = {})
formatter(locale, :date, format).apply(object, options)
end
def format_time(locale, object, format = :default, options = {})
formatter(locale, :time, format).apply(object, options)
end
def format_datetime(locale, object, format = :default, options = {})
key = :"calendars.gregorian.formats.datetime.#{format}.pattern"
date = I18n.l(object, :format => options[:date_format] || format, :locale => locale, :as => :date)
time = I18n.l(object, :format => options[:time_format] || format, :locale => locale, :as => :time)
I18n.t(key, :date => date, :time => time, :locale => locale, :raise => true)
end
protected
def detect_type(object, options)
options.has_key?(:currency) ? :currency : case object
when ::Numeric
:decimal
when ::Date, ::DateTime, ::Time
object.class.name.downcase.to_sym
else
raise_unspecified_format_type!
end
end
def formatter(locale, type, format)
(@formatters ||= {})[:"#{locale}.#{type}.#{format}"] ||= begin
format = lookup_format(locale, type, format)
data = lookup_format_data(locale, type)
::Cldr::Format.const_get(type.to_s.camelize).new(format, data)
end
end
def lookup_format(locale, type, format)
key = case type
when :date, :time, :datetime
:"calendars.gregorian.formats.#{type}.#{format}.pattern"
else
:"numbers.formats.#{type}.patterns.#{format || :default}"
end
I18n.t(key, :locale => locale, :raise => true)
end
def lookup_format_data(locale, type)
key = case type
when :date, :time, :datetime
:'calendars.gregorian'
else
:'numbers.symbols'
end
I18n.t(key, :locale => locale, :raise => true)
end
def lookup_currency(locale, currency, count)
I18n.t(:"currencies.#{currency}", :locale => locale, :count => count)
end
def raise_unspecified_format_type!
raise ArgumentError.new("You have to specify a format type, e.g. :as => :number.")
end
def raise_unspecified_currency!
raise ArgumentError.new("You have to specify a currency, e.g. :currency => 'EUR'.")
end
end
end
end

View File

@@ -1,69 +0,0 @@
# encoding: utf-8
# I18n locale fallbacks are useful when you want your application to use
# translations from other locales when translations for the current locale are
# missing. E.g. you might want to use :en translations when translations in
# your applications main locale :de are missing.
#
# To enable locale fallbacks you can simply include the Fallbacks module to
# the Simple backend - or whatever other backend you are using:
#
# I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
module I18n
@@fallbacks = nil
class << self
# Returns the current fallbacks implementation. Defaults to +I18n::Locale::Fallbacks+.
def fallbacks
@@fallbacks ||= I18n::Locale::Fallbacks.new
end
# Sets the current fallbacks implementation. Use this to set a different fallbacks implementation.
def fallbacks=(fallbacks)
@@fallbacks = fallbacks
end
end
module Backend
module Fallbacks
# Overwrites the Base backend translate method so that it will try each
# locale given by I18n.fallbacks for the given locale. E.g. for the
# locale :"de-DE" it might try the locales :"de-DE", :de and :en
# (depends on the fallbacks implementation) until it finds a result with
# the given options. If it does not find any result for any of the
# locales it will then raise a MissingTranslationData exception as
# usual.
#
# The default option takes precedence over fallback locales
# only when it's not a String. When default contains String it
# is evaluated after fallback locales.
def translate(locale, key, options = {})
default = extract_string_default!(options) if options[:default]
I18n.fallbacks[locale].each do |fallback|
begin
result = super(fallback, key, options)
return result unless result.nil?
rescue I18n::MissingTranslationData
end
end
return super(locale, nil, options.merge(:default => default)) if default
raise(I18n::MissingTranslationData.new(locale, key, options))
end
def extract_string_default!(options)
defaults = Array(options[:default])
if index = find_first_string_default(defaults)
options[:default] = defaults[0, index]
defaults[index]
end
end
def find_first_string_default(defaults)
defaults.each_index { |ix| return ix if String === defaults[ix] }
nil
end
end
end
end

View File

@@ -1,113 +0,0 @@
module I18n
module Backend
# This module contains several helpers to assist flattening translations.
# You may want to flatten translations for:
#
# 1) speed up lookups, as in the Memoize backend;
# 2) In case you want to store translations in a data store, as in ActiveRecord backend;
#
# You can check both backends above for some examples.
# This module also keeps all links in a hash so they can be properly resolved when flattened.
module Flatten
SEPARATOR_ESCAPE_CHAR = "\001"
FLATTEN_SEPARATOR = "."
# normalize_keys the flatten way. This method is significantly faster
# and creates way less objects than the one at I18n.normalize_keys.
# It also handles escaping the translation keys.
def self.normalize_flat_keys(locale, key, scope, separator)
keys = [scope, key].flatten.compact
separator ||= I18n.default_separator
if separator != FLATTEN_SEPARATOR
keys.map! do |k|
k.to_s.tr("#{FLATTEN_SEPARATOR}#{separator}",
"#{SEPARATOR_ESCAPE_CHAR}#{FLATTEN_SEPARATOR}")
end
end
keys.join(".")
end
# Receives a string and escape the default separator.
def self.escape_default_separator(key) #:nodoc:
key.to_s.tr(FLATTEN_SEPARATOR, SEPARATOR_ESCAPE_CHAR)
end
# Shortcut to I18n::Backend::Flatten.normalize_flat_keys
# and then resolve_links.
def normalize_flat_keys(locale, key, scope, separator)
key = I18n::Backend::Flatten.normalize_flat_keys(locale, key, scope, separator)
resolve_link(locale, key)
end
# Store flattened links.
def links
@links ||= Hash.new { |h,k| h[k] = {} }
end
# Flatten keys for nested Hashes by chaining up keys:
#
# >> { "a" => { "b" => { "c" => "d", "e" => "f" }, "g" => "h" }, "i" => "j"}.wind
# => { "a.b.c" => "d", "a.b.e" => "f", "a.g" => "h", "i" => "j" }
#
def flatten_keys(hash, escape, prev_key=nil, &block)
hash.each_pair do |key, value|
key = escape_default_separator(key) if escape
curr_key = [prev_key, key].compact.join(FLATTEN_SEPARATOR).to_sym
yield curr_key, value
flatten_keys(value, escape, curr_key, &block) if value.is_a?(Hash)
end
end
# Receives a hash of translations (where the key is a locale and
# the value is another hash) and return a hash with all
# translations flattened.
#
# Nested hashes are included in the flattened hash just if subtree
# is true and Symbols are automatically stored as links.
def flatten_translations(locale, data, escape, subtree)
hash = {}
flatten_keys(data, escape) do |key, value|
if value.is_a?(Hash)
hash[key] = value if subtree
else
store_link(locale, key, value) if value.is_a?(Symbol)
hash[key] = value
end
end
hash
end
protected
def store_link(locale, key, link)
links[locale.to_sym][key.to_s] = link.to_s
end
def resolve_link(locale, key)
key, locale = key.to_s, locale.to_sym
links = self.links[locale]
if links.key?(key)
links[key]
elsif link = find_link(locale, key)
store_link(locale, key, key.gsub(*link))
else
key
end
end
def find_link(locale, key) #:nodoc:
links[locale].each do |from, to|
return [from, to] if key[0, from.length] == from
end && nil
end
def escape_default_separator(key) #:nodoc:
I18n::Backend::Flatten.escape_default_separator(key)
end
end
end
end

View File

@@ -1,75 +0,0 @@
# encoding: utf-8
require 'i18n/gettext'
require 'i18n/gettext/po_parser'
# Experimental support for using Gettext po files to store translations.
#
# To use this you can simply include the module to the Simple backend - or
# whatever other backend you are using.
#
# I18n::Backend::Simple.send(:include, I18n::Backend::Gettext)
#
# Now you should be able to include your Gettext translation (*.po) files to
# the I18n.load_path so they're loaded to the backend and you can use them as
# usual:
#
# I18n.load_path += Dir["path/to/locales/*.po"]
#
# Following the Gettext convention this implementation expects that your
# translation files are named by their locales. E.g. the file en.po would
# contain the translations for the English locale.
module I18n
module Backend
module Gettext
class PoData < Hash
def set_comment(msgid_or_sym, comment)
# ignore
end
end
protected
def load_po(filename)
locale = ::File.basename(filename, '.po').to_sym
data = normalize(locale, parse(filename))
{ locale => data }
end
def parse(filename)
GetText::PoParser.new.parse(::File.read(filename), PoData.new)
end
def normalize(locale, data)
data.inject({}) do |result, (key, value)|
unless key.nil? || key.empty?
key, value = normalize_pluralization(locale, key, value) if key.index("\000")
parts = key.split('|').reverse
normalized = parts.inject({}) do |normalized, part|
normalized = { part => normalized.empty? ? value : normalized }
end
# deep_merge by Stefan Rusterholz, see http://www.ruby-forum.com/topic/142809
merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
result.merge!(normalized, &merger)
end
result
end
end
def normalize_pluralization(locale, key, value)
# FIXME po_parser includes \000 chars that can not be turned into Symbols
key = key.gsub("\000", I18n::Gettext::PLURAL_SEPARATOR).split(I18n::Gettext::PLURAL_SEPARATOR).first
keys = I18n::Gettext.plural_keys(locale)
values = value.split("\000")
raise "invalid number of plurals: #{values.size}, keys: #{keys.inspect}" if values.size != keys.size
result = {}
values.each_with_index { |value, ix| result[keys[ix]] = value }
[key, result]
end
end
end
end

View File

@@ -1,123 +0,0 @@
# encoding: utf-8
# The InterpolationCompiler module contains optimizations that can tremendously
# speed up the interpolation process on the Simple backend.
#
# It works by defining a pre-compiled method on stored translation Strings that
# already bring all the knowledge about contained interpolation variables etc.
# so that the actual recurring interpolation will be very fast.
#
# To enable pre-compiled interpolations you can simply include the
# InterpolationCompiler module to the Simple backend:
#
# I18n::Backend::Simple.send(:include, I18n::Backend::InterpolationCompiler)
#
# Note that InterpolationCompiler does not yield meaningful results and consequently
# should not be used with Ruby 1.9 (YARV) but improves performance everywhere else
# (jRuby, Rubinius and 1.8.7).
module I18n
module Backend
module InterpolationCompiler
module Compiler
extend self
TOKENIZER = /(%%\{[^\}]+\}|%\{[^\}]+\})/
INTERPOLATION_SYNTAX_PATTERN = /(%)?(%\{([^\}]+)\})/
def compile_if_an_interpolation(string)
if interpolated_str?(string)
string.instance_eval <<-RUBY_EVAL, __FILE__, __LINE__
def i18n_interpolate(v = {})
"#{compiled_interpolation_body(string)}"
end
RUBY_EVAL
end
string
end
def interpolated_str?(str)
str.kind_of?(::String) && str =~ INTERPOLATION_SYNTAX_PATTERN
end
protected
# tokenize("foo %{bar} baz %%{buz}") # => ["foo ", "%{bar}", " baz ", "%%{buz}"]
def tokenize(str)
str.split(TOKENIZER)
end
def compiled_interpolation_body(str)
tokenize(str).map do |token|
(matchdata = token.match(INTERPOLATION_SYNTAX_PATTERN)) ? handle_interpolation_token(token, matchdata) : escape_plain_str(token)
end.join
end
def handle_interpolation_token(interpolation, matchdata)
escaped, pattern, key = matchdata.values_at(1, 2, 3)
escaped ? pattern : compile_interpolation_token(key.to_sym)
end
def compile_interpolation_token(key)
"\#{#{interpolate_or_raise_missing(key)}}"
end
def interpolate_or_raise_missing(key)
escaped_key = escape_key_sym(key)
Base::RESERVED_KEYS.include?(key) ? reserved_key(escaped_key) : interpolate_key(escaped_key)
end
def interpolate_key(key)
[direct_key(key), nil_key(key), missing_key(key)].join('||')
end
def direct_key(key)
"((t = v[#{key}]) && t.respond_to?(:call) ? t.call : t)"
end
def nil_key(key)
"(v.has_key?(#{key}) && '')"
end
def missing_key(key)
"raise(MissingInterpolationArgument.new(#{key}, self))"
end
def reserved_key(key)
"raise(ReservedInterpolationKey.new(#{key}, self))"
end
def escape_plain_str(str)
str.gsub(/"|\\|#/) {|x| "\\#{x}"}
end
def escape_key_sym(key)
# rely on Ruby to do all the hard work :)
key.to_sym.inspect
end
end
def interpolate(locale, string, values)
if string.respond_to?(:i18n_interpolate)
string.i18n_interpolate(values)
elsif values
super
else
string
end
end
def store_translations(locale, data, options = {})
compile_all_strings_in(data)
super
end
protected
def compile_all_strings_in(data)
data.each_value do |value|
Compiler.compile_if_an_interpolation(value)
compile_all_strings_in(value) if value.kind_of?(Hash)
end
end
end
end
end

View File

@@ -1,102 +0,0 @@
# encoding: utf-8
require 'i18n/backend/base'
require 'active_support/json'
module I18n
module Backend
# This is a basic backend for key value stores. It receives on
# initialization the store, which should respond to three methods:
#
# * store#[](key) - Used to get a value
# * store#[]=(key, value) - Used to set a value
# * store#keys - Used to get all keys
#
# Since these stores only supports string, all values are converted
# to JSON before being stored, allowing it to also store booleans,
# hashes and arrays. However, this store does not support Procs.
#
# As the ActiveRecord backend, Symbols are just supported when loading
# translations from the filesystem or through explicit store translations.
#
# Also, avoid calling I18n.available_locales since it's a somehow
# expensive operation in most stores.
#
# == Example
#
# To setup I18n to use TokyoCabinet in memory is quite straightforward:
#
# require 'rufus/tokyo/cabinet' # gem install rufus-tokyo
# I18n.backend = I18n::Backend::KeyValue.new(Rufus::Tokyo::Cabinet.new('*'))
#
# == Performance
#
# You may make this backend even faster by including the Memoize module.
# However, notice that you should properly clear the cache if you change
# values directly in the key-store.
#
# == Subtrees
#
# In most backends, you are allowed to retrieve part of a translation tree:
#
# I18n.backend.store_translations :en, :foo => { :bar => :baz }
# I18n.t "foo" #=> { :bar => :baz }
#
# This backend supports this feature by default, but it slows down the storage
# of new data considerably and makes hard to delete entries. That said, you are
# allowed to disable the storage of subtrees on initialization:
#
# I18n::Backend::KeyValue.new(@store, false)
#
# This is useful if you are using a KeyValue backend chained to a Simple backend.
class KeyValue
module Implementation
attr_accessor :store
include Base, Flatten
def initialize(store, subtrees=true)
@store, @subtrees = store, subtrees
end
def store_translations(locale, data, options = {})
escape = options.fetch(:escape, true)
flatten_translations(locale, data, escape, @subtrees).each do |key, value|
key = "#{locale}.#{key}"
case value
when Hash
if @subtrees && (old_value = @store[key])
old_value = ActiveSupport::JSON.decode(old_value)
value = old_value.deep_symbolize_keys.deep_merge!(value) if old_value.is_a?(Hash)
end
when Proc
raise "Key-value stores cannot handle procs"
end
@store[key] = ActiveSupport::JSON.encode(value) unless value.is_a?(Symbol)
end
end
def available_locales
locales = @store.keys.map { |k| k =~ /\./; $` }
locales.uniq!
locales.compact!
locales.map! { |k| k.to_sym }
locales
end
protected
def lookup(locale, key, scope = [], options = {})
key = normalize_flat_keys(locale, key, scope, options[:separator])
value = @store["#{locale}.#{key}"]
value = ActiveSupport::JSON.decode(value) if value
value.is_a?(Hash) ? value.deep_symbolize_keys : value
end
end
include Implementation
end
end
end

View File

@@ -1,48 +0,0 @@
# encoding: utf-8
#
# Memoize module simply memoizes the values returned by lookup using
# a flat hash and can tremendously speed up the lookup process in a backend.
#
# To enable it you can simply include the Memoize module to your backend:
#
# I18n::Backend::Simple.send(:include, I18n::Backend::Memoize)
#
# Notice that it's the responsibility of the backend to define whenever the
# cache should be cleaned.
module I18n
module Backend
module Memoize
def available_locales
@memoized_locales ||= super
end
def store_translations(locale, data, options = {})
reset_memoizations!(locale)
super
end
def reload!
reset_memoizations!
super
end
protected
def lookup(locale, key, scope = nil, options = {})
flat_key = I18n::Backend::Flatten.normalize_flat_keys(locale,
key, scope, options[:separator]).to_sym
flat_hash = memoized_lookup[locale.to_sym]
flat_hash.key?(flat_key) ? flat_hash[flat_key] : (flat_hash[flat_key] = super)
end
def memoized_lookup
@memoized_lookup ||= Hash.new { |h, k| h[k] = {} }
end
def reset_memoizations!(locale=nil)
@memoized_locales = nil
(locale ? memoized_lookup[locale.to_sym] : memoized_lookup).clear
end
end
end
end

View File

@@ -1,65 +0,0 @@
# I18n translation metadata is useful when you want to access information
# about how a translation was looked up, pluralized or interpolated in
# your application.
#
# msg = I18n.t(:message, :default => 'Hi!', :scope => :foo)
# msg.translation_metadata
# # => { :key => :message, :scope => :foo, :default => 'Hi!' }
#
# If a :count option was passed to #translate it will be set to the metadata.
# Likewise, if any interpolation variables were passed they will also be set.
#
# To enable translation metadata you can simply include the Metadata module
# into the Simple backend class - or whatever other backend you are using:
#
# I18n::Backend::Simple.send(:include, I18n::Backend::Metadata)
#
module I18n
module Backend
module Metadata
class << self
def included(base)
Object.class_eval do
def translation_metadata
@translation_metadata ||= {}
end
def translation_metadata=(translation_metadata)
@translation_metadata = translation_metadata
end
end unless Object.method_defined?(:translation_metadata)
end
end
def translate(locale, key, options = {})
metadata = {
:locale => locale,
:key => key,
:scope => options[:scope],
:default => options[:default],
:separator => options[:separator],
:values => options.reject { |name, value| Base::RESERVED_KEYS.include?(name) }
}
with_metadata(metadata) { super }
end
def interpolate(locale, entry, values = {})
metadata = entry.translation_metadata.merge(:original => entry)
with_metadata(metadata) { super }
end
def pluralize(locale, entry, count)
with_metadata(:count => count) { super }
end
protected
def with_metadata(metadata, &block)
result = yield
result.translation_metadata = result.translation_metadata.merge(metadata) if result
result
end
end
end
end

View File

@@ -1,57 +0,0 @@
# encoding: utf-8
# I18n locale fallbacks are useful when you want your application to use
# translations from other locales when translations for the current locale are
# missing. E.g. you might want to use :en translations when translations in
# your applications main locale :de are missing.
#
# To enable locale specific pluralizations you can simply include the
# Pluralization module to the Simple backend - or whatever other backend you
# are using.
#
# I18n::Backend::Simple.send(:include, I18n::Backend::Pluralization)
#
# You also need to make sure to provide pluralization algorithms to the
# backend, i.e. include them to your I18n.load_path accordingly.
module I18n
module Backend
module Pluralization
# Overwrites the Base backend translate method so that it will check the
# translation meta data space (:i18n) for a locale specific pluralization
# rule and use it to pluralize the given entry. I.e. the library expects
# pluralization rules to be stored at I18n.t(:'i18n.plural.rule')
#
# Pluralization rules are expected to respond to #call(entry, count) and
# return a pluralization key. Valid keys depend on the translation data
# hash (entry) but it is generally recommended to follow CLDR's style,
# i.e., return one of the keys :zero, :one, :few, :many, :other.
#
# The :zero key is always picked directly when count equals 0 AND the
# translation data has the key :zero. This way translators are free to
# either pick a special :zero translation even for languages where the
# pluralizer does not return a :zero key.
def pluralize(locale, entry, count)
return entry unless entry.is_a?(Hash) and count
pluralizer = pluralizer(locale)
if pluralizer.respond_to?(:call)
key = count == 0 && entry.has_key?(:zero) ? :zero : pluralizer.call(count)
raise InvalidPluralizationData.new(entry, count) unless entry.has_key?(key)
entry[key]
else
super
end
end
protected
def pluralizers
@pluralizers ||= {}
end
def pluralizer(locale)
pluralizers[locale] ||= I18n.t(:'i18n.plural.rule', :locale => locale, :resolve => false)
end
end
end
end

View File

@@ -1,87 +0,0 @@
# encoding: utf-8
module I18n
module Backend
# A simple backend that reads translations from YAML files and stores them in
# an in-memory hash. Relies on the Base backend.
#
# The implementation is provided by a Implementation module allowing to easily
# extend Simple backend's behavior by including modules. E.g.:
#
# module I18n::Backend::Pluralization
# def pluralize(*args)
# # extended pluralization logic
# super
# end
# end
#
# I18n::Backend::Simple.send(:include, I18n::Backend::Pluralization)
class Simple
module Implementation
include Base
def initialized?
@initialized ||= false
end
# Stores translations for the given locale in memory.
# This uses a deep merge for the translations hash, so existing
# translations will be overwritten by new ones only at the deepest
# level of the hash.
def store_translations(locale, data, options = {})
locale = locale.to_sym
translations[locale] ||= {}
data = data.deep_symbolize_keys
translations[locale].deep_merge!(data)
end
# Get available locales from the translations hash
def available_locales
init_translations unless initialized?
translations.inject([]) do |locales, (locale, data)|
locales << locale unless (data.keys - [:i18n]).empty?
locales
end
end
# Clean up translations hash and set initialized to false on reload!
def reload!
@initialized = false
@translations = nil
super
end
protected
def init_translations
load_translations
@initialized = true
end
def translations
@translations ||= {}
end
# Looks up a translation from the translations hash. Returns nil if
# eiher key is nil, or locale, scope or key do not exist as a key in the
# nested translations hash. Splits keys or scopes containing dots
# into multiple keys, i.e. <tt>currency.format</tt> is regarded the same as
# <tt>%w(currency format)</tt>.
def lookup(locale, key, scope = [], options = {})
init_translations unless initialized?
keys = I18n.normalize_keys(locale, key, scope, options[:separator])
keys.inject(translations) do |result, key|
key = key.to_sym
return nil unless result.is_a?(Hash) && result.has_key?(key)
result = result[key]
result = resolve(locale, key, result, options.merge(:scope => nil)) if result.is_a?(Symbol)
result
end
end
end
include Implementation
end
end
end

View File

@@ -1,98 +0,0 @@
# encoding: utf-8
module I18n
module Backend
module Transliterator
DEFAULT_REPLACEMENT_CHAR = "?"
# Given a locale and a UTF-8 string, return the locale's ASCII
# approximation for the string.
def transliterate(locale, string, replacement = nil)
@transliterators ||= {}
@transliterators[locale] ||= Transliterator.get I18n.t(:'i18n.transliterate.rule',
:locale => locale, :resolve => false, :default => {})
@transliterators[locale].transliterate(string, replacement)
end
# Get a transliterator instance.
def self.get(rule = nil)
if !rule || rule.kind_of?(Hash)
HashTransliterator.new(rule)
elsif rule.kind_of? Proc
ProcTransliterator.new(rule)
else
raise I18n::ArgumentError, "Transliteration rule must be a proc or a hash."
end
end
# A transliterator which accepts a Proc as its transliteration rule.
class ProcTransliterator
def initialize(rule)
@rule = rule
end
def transliterate(string, replacement = nil)
@rule.call(string)
end
end
# A transliterator which accepts a Hash of characters as its translation
# rule.
class HashTransliterator
DEFAULT_APPROXIMATIONS = {
"À"=>"A", "Á"=>"A", "Â"=>"A", "Ã"=>"A", "Ä"=>"A", "Å"=>"A", "Æ"=>"AE",
"Ç"=>"C", "È"=>"E", "É"=>"E", "Ê"=>"E", "Ë"=>"E", "Ì"=>"I", "Í"=>"I",
"Î"=>"I", "Ï"=>"I", "Ð"=>"D", "Ñ"=>"N", "Ò"=>"O", "Ó"=>"O", "Ô"=>"O",
"Õ"=>"O", "Ö"=>"O", "×"=>"x", "Ø"=>"O", "Ù"=>"U", "Ú"=>"U", "Û"=>"U",
"Ü"=>"U", "Ý"=>"Y", "Þ"=>"Th", "ß"=>"ss", "à"=>"a", "á"=>"a", "â"=>"a",
"ã"=>"a", "ä"=>"a", "å"=>"a", "æ"=>"ae", "ç"=>"c", "è"=>"e", "é"=>"e",
"ê"=>"e", "ë"=>"e", "ì"=>"i", "í"=>"i", "î"=>"i", "ï"=>"i", "ð"=>"d",
"ñ"=>"n", "ò"=>"o", "ó"=>"o", "ô"=>"o", "õ"=>"o", "ö"=>"o", "ø"=>"o",
"ù"=>"u", "ú"=>"u", "û"=>"u", "ü"=>"u", "ý"=>"y", "þ"=>"th", "ÿ"=>"y",
"Ā"=>"A", "ā"=>"a", "Ă"=>"A", "ă"=>"a", "Ą"=>"A", "ą"=>"a", "Ć"=>"C",
"ć"=>"c", "Ĉ"=>"C", "ĉ"=>"c", "Ċ"=>"C", "ċ"=>"c", "Č"=>"C", "č"=>"c",
"Ď"=>"D", "ď"=>"d", "Đ"=>"D", "đ"=>"d", "Ē"=>"E", "ē"=>"e", "Ĕ"=>"E",
"ĕ"=>"e", "Ė"=>"E", "ė"=>"e", "Ę"=>"E", "ę"=>"e", "Ě"=>"E", "ě"=>"e",
"Ĝ"=>"G", "ĝ"=>"g", "Ğ"=>"G", "ğ"=>"g", "Ġ"=>"G", "ġ"=>"g", "Ģ"=>"G",
"ģ"=>"g", "Ĥ"=>"H", "ĥ"=>"h", "Ħ"=>"H", "ħ"=>"h", "Ĩ"=>"I", "ĩ"=>"i",
"Ī"=>"I", "ī"=>"i", "Ĭ"=>"I", "ĭ"=>"i", "Į"=>"I", "į"=>"i", "İ"=>"I",
"ı"=>"i", "IJ"=>"IJ", "ij"=>"ij", "Ĵ"=>"J", "ĵ"=>"j", "Ķ"=>"K", "ķ"=>"k",
"ĸ"=>"k", "Ĺ"=>"L", "ĺ"=>"l", "Ļ"=>"L", "ļ"=>"l", "Ľ"=>"L", "ľ"=>"l",
"Ŀ"=>"L", "ŀ"=>"l", "Ł"=>"L", "ł"=>"l", "Ń"=>"N", "ń"=>"n", "Ņ"=>"N",
"ņ"=>"n", "Ň"=>"N", "ň"=>"n", "ʼn"=>"'n", "Ŋ"=>"NG", "ŋ"=>"ng",
"Ō"=>"O", "ō"=>"o", "Ŏ"=>"O", "ŏ"=>"o", "Ő"=>"O", "ő"=>"o", "Œ"=>"OE",
"œ"=>"oe", "Ŕ"=>"R", "ŕ"=>"r", "Ŗ"=>"R", "ŗ"=>"r", "Ř"=>"R", "ř"=>"r",
"Ś"=>"S", "ś"=>"s", "Ŝ"=>"S", "ŝ"=>"s", "Ş"=>"S", "ş"=>"s", "Š"=>"S",
"š"=>"s", "Ţ"=>"T", "ţ"=>"t", "Ť"=>"T", "ť"=>"t", "Ŧ"=>"T", "ŧ"=>"t",
"Ũ"=>"U", "ũ"=>"u", "Ū"=>"U", "ū"=>"u", "Ŭ"=>"U", "ŭ"=>"u", "Ů"=>"U",
"ů"=>"u", "Ű"=>"U", "ű"=>"u", "Ų"=>"U", "ų"=>"u", "Ŵ"=>"W", "ŵ"=>"w",
"Ŷ"=>"Y", "ŷ"=>"y", "Ÿ"=>"Y", "Ź"=>"Z", "ź"=>"z", "Ż"=>"Z", "ż"=>"z",
"Ž"=>"Z", "ž"=>"z"
}
def initialize(rule = nil)
@rule = rule
add DEFAULT_APPROXIMATIONS
add rule if rule
end
def transliterate(string, replacement = nil)
string.gsub(/[^\x00-\x7f]/u) do |char|
approximations[char] || replacement || DEFAULT_REPLACEMENT_CHAR
end
end
private
def approximations
@approximations ||= {}
end
# Add transliteration rules to the approximations hash.
def add(hash)
hash.keys.each {|key| hash[key.to_s] = hash.delete(key).to_s}
approximations.merge! hash
end
end
end
end
end

View File

@@ -1,84 +0,0 @@
module I18n
class Config
# The only configuration value that is not global and scoped to thread is :locale.
# It defaults to the default_locale.
def locale
@locale ||= default_locale
end
# Sets the current locale pseudo-globally, i.e. in the Thread.current hash.
def locale=(locale)
@locale = locale.to_sym rescue nil
end
# Returns the current backend. Defaults to +Backend::Simple+.
def backend
@@backend ||= Backend::Simple.new
end
# Sets the current backend. Used to set a custom backend.
def backend=(backend)
@@backend = backend
end
# Returns the current default locale. Defaults to :'en'
def default_locale
@@default_locale ||= :en
end
# Sets the current default locale. Used to set a custom default locale.
def default_locale=(locale)
@@default_locale = locale.to_sym rescue nil
end
# Returns an array of locales for which translations are available.
# Unless you explicitely set the these through I18n.available_locales=
# the call will be delegated to the backend and memoized on the I18n module.
def available_locales
@@available_locales ||= backend.available_locales
end
# Sets the available locales.
def available_locales=(locales)
@@available_locales = locales
end
# Returns the current default scope separator. Defaults to '.'
def default_separator
@@default_separator ||= '.'
end
# Sets the current default scope separator.
def default_separator=(separator)
@@default_separator = separator
end
# Return the current exception handler. Defaults to :default_exception_handler.
def exception_handler
@@exception_handler ||= :default_exception_handler
end
# Sets the exception handler.
def exception_handler=(exception_handler)
@@exception_handler = exception_handler
end
# Allow clients to register paths providing translation data sources. The
# backend defines acceptable sources.
#
# E.g. the provided SimpleBackend accepts a list of paths to translation
# files which are either named *.rb and contain plain Ruby Hashes or are
# named *.yml and contain YAML data. So for the SimpleBackend clients may
# register translation files like this:
# I18n.load_path << 'path/to/locale/en.yml'
def load_path
@@load_path ||= []
end
# Sets the load path instance. Custom implementations are expected to
# behave like a Ruby Array.
def load_path=(load_path)
@@load_path = load_path
end
end
end

View File

@@ -1,29 +0,0 @@
class Hash
def slice(*keep_keys)
h = {}
keep_keys.each { |key| h[key] = fetch(key) }
h
end unless Hash.method_defined?(:slice)
def except(*less_keys)
slice(*keys - less_keys)
end unless Hash.method_defined?(:except)
def deep_symbolize_keys
inject({}) { |result, (key, value)|
value = value.deep_symbolize_keys if value.is_a?(Hash)
result[(key.to_sym rescue key) || key] = value
result
}
end unless Hash.method_defined?(:deep_symbolize_keys)
# deep_merge_hash! by Stefan Rusterholz, see http://www.ruby-forum.com/topic/142809
MERGER = proc do |key, v1, v2|
Hash === v1 && Hash === v2 ? v1.merge(v2, &MERGER) : v2
end
def deep_merge!(data)
merge!(data, &MERGER)
end unless Hash.method_defined?(:deep_merge!)
end

View File

@@ -1,98 +0,0 @@
# encoding: utf-8
=begin
heavily based on Masao Mutoh's gettext String interpolation extension
http://github.com/mutoh/gettext/blob/f6566738b981fe0952548c421042ad1e0cdfb31e/lib/gettext/core_ext/string.rb
Copyright (C) 2005-2009 Masao Mutoh
You may redistribute it and/or modify it under the same license terms as Ruby.
=end
begin
raise ArgumentError if ("a %{x}" % {:x=>'b'}) != 'a b'
rescue ArgumentError
# KeyError is raised by String#% when the string contains a named placeholder
# that is not contained in the given arguments hash. Ruby 1.9 includes and
# raises this exception natively. We define it to mimic Ruby 1.9's behaviour
# in Ruby 1.8.x
class KeyError < IndexError
def initialize(message = nil)
super(message || "key not found")
end
end unless defined?(KeyError)
# Extension for String class. This feature is included in Ruby 1.9 or later but not occur TypeError.
#
# String#% method which accept "named argument". The translator can know
# the meaning of the msgids using "named argument" instead of %s/%d style.
class String
# For older ruby versions, such as ruby-1.8.5
alias :bytesize :size unless instance_methods.find {|m| m.to_s == 'bytesize'}
alias :interpolate_without_ruby_19_syntax :% # :nodoc:
INTERPOLATION_PATTERN = Regexp.union(
/%\{(\w+)\}/, # matches placeholders like "%{foo}"
/%<(\w+)>(.*?\d*\.?\d*[bBdiouxXeEfgGcps])/ # matches placeholders like "%<foo>.d"
)
INTERPOLATION_PATTERN_WITH_ESCAPE = Regexp.union(
/%%/,
INTERPOLATION_PATTERN
)
# % uses self (i.e. the String) as a format specification and returns the
# result of applying it to the given arguments. In other words it interpolates
# the given arguments to the string according to the formats the string
# defines.
#
# There are three ways to use it:
#
# * Using a single argument or Array of arguments.
#
# This is the default behaviour of the String class. See Kernel#sprintf for
# more details about the format string.
#
# Example:
#
# "%d %s" % [1, "message"]
# # => "1 message"
#
# * Using a Hash as an argument and unformatted, named placeholders.
#
# When you pass a Hash as an argument and specify placeholders with %{foo}
# it will interpret the hash values as named arguments.
#
# Example:
#
# "%{firstname}, %{lastname}" % {:firstname => "Masao", :lastname => "Mutoh"}
# # => "Masao Mutoh"
#
# * Using a Hash as an argument and formatted, named placeholders.
#
# When you pass a Hash as an argument and specify placeholders with %<foo>d
# it will interpret the hash values as named arguments and format the value
# according to the formatting instruction appended to the closing >.
#
# Example:
#
# "%<integer>d, %<float>.1f" % { :integer => 10, :float => 43.4 }
# # => "10, 43.3"
def %(args)
if args.kind_of?(Hash)
dup.gsub(INTERPOLATION_PATTERN_WITH_ESCAPE) do |match|
if match == '%%'
'%'
else
key = ($1 || $2).to_sym
raise KeyError unless args.has_key?(key)
$3 ? sprintf("%#{$3}", args[key]) : args[key]
end
end
elsif self =~ INTERPOLATION_PATTERN
raise ArgumentError.new('one hash required')
else
result = gsub(/%([{<])/, '%%\1')
result.send :'interpolate_without_ruby_19_syntax', args
end
end
end
end

View File

@@ -1,61 +0,0 @@
# encoding: utf-8
class KeyError < IndexError
def initialize(message = nil)
super(message || "key not found")
end
end unless defined?(KeyError)
module I18n
class ArgumentError < ::ArgumentError; end
class InvalidLocale < ArgumentError
attr_reader :locale
def initialize(locale)
@locale = locale
super "#{locale.inspect} is not a valid locale"
end
end
class MissingTranslationData < ArgumentError
attr_reader :locale, :key, :options
def initialize(locale, key, opts = nil)
@key, @locale, @options = key, locale, opts || {}
keys = I18n.normalize_keys(locale, key, options[:scope])
keys << 'no key' if keys.size < 2
super "translation missing: #{keys.join(', ')}"
end
end
class InvalidPluralizationData < ArgumentError
attr_reader :entry, :count
def initialize(entry, count)
@entry, @count = entry, count
super "translation data #{entry.inspect} can not be used with :count => #{count}"
end
end
class MissingInterpolationArgument < ArgumentError
attr_reader :values, :string
def initialize(values, string)
@values, @string = values, string
super "missing interpolation argument in #{string.inspect} (#{values.inspect} given)"
end
end
class ReservedInterpolationKey < ArgumentError
attr_reader :key, :string
def initialize(key, string)
@key, @string = key, string
super "reserved key #{key.inspect} used in #{string.inspect}"
end
end
class UnknownFileType < ArgumentError
attr_reader :type, :filename
def initialize(type, filename)
@type, @filename = type, filename
super "can not load translations from #{filename}, the file type #{type} is not known"
end
end
end

View File

@@ -1,27 +0,0 @@
# encoding: utf-8
module I18n
module Gettext
PLURAL_SEPARATOR = "\001"
CONTEXT_SEPARATOR = "\004"
autoload :Helpers, 'i18n/gettext/helpers'
@@plural_keys = { :en => [:one, :other] }
class << self
# returns an array of plural keys for the given locale so that we can
# convert from gettext's integer-index based style
# TODO move this information to the pluralization module
def plural_keys(locale)
@@plural_keys[locale] || @@plural_keys[:en]
end
def extract_scope(msgid, separator)
scope = msgid.to_s.split(separator)
msgid = scope.pop
[scope, msgid]
end
end
end
end

View File

@@ -1,65 +0,0 @@
# encoding: utf-8
require 'i18n/gettext'
module I18n
module Gettext
# Implements classical Gettext style accessors. To use this include the
# module to the global namespace or wherever you want to use it.
#
# include I18n::Helpers::Gettext
module Helpers
def gettext(msgid, options = {})
I18n.t(msgid, { :default => msgid, :separator => '|' }.merge(options))
end
alias _ gettext
def sgettext(msgid, separator = '|')
scope, msgid = I18n::Gettext.extract_scope(msgid, separator)
I18n.t(msgid, :scope => scope, :default => msgid, :separator => separator)
end
alias s_ sgettext
def pgettext(msgctxt, msgid)
separator = I18n::Gettext::CONTEXT_SEPARATOR
sgettext([msgctxt, msgid].join(separator), separator)
end
alias p_ pgettext
def ngettext(msgid, msgid_plural, n = 1)
nsgettext(msgid, msgid_plural, n)
end
alias n_ ngettext
# Method signatures:
# nsgettext('Fruits|apple', 'apples', 2)
# nsgettext(['Fruits|apple', 'apples'], 2)
def nsgettext(msgid, msgid_plural, n = 1, separator = '|')
if msgid.is_a?(Array)
msgid, msgid_plural, n, separator = msgid[0], msgid[1], msgid_plural, n
separator = '|' unless separator.is_a?(::String)
end
scope, msgid = I18n::Gettext.extract_scope(msgid, separator)
default = { :one => msgid, :other => msgid_plural }
I18n.t(msgid, :default => default, :count => n, :scope => scope, :separator => separator)
end
alias ns_ nsgettext
# Method signatures:
# npgettext('Fruits', 'apple', 'apples', 2)
# npgettext('Fruits', ['apple', 'apples'], 2)
def npgettext(msgctxt, msgid, msgid_plural, n = 1)
separator = I18n::Gettext::CONTEXT_SEPARATOR
if msgid.is_a?(Array)
msgid_plural, msgid, n = msgid[1], [msgctxt, msgid[0]].join(separator), msgid_plural
else
msgid = [msgctxt, msgid].join(separator)
end
nsgettext(msgid, msgid_plural, n, separator)
end
alias np_ npgettext
end
end
end

View File

@@ -1,329 +0,0 @@
=begin
poparser.rb - Generate a .mo
Copyright (C) 2003-2009 Masao Mutoh <mutoh at highway.ne.jp>
You may redistribute it and/or modify it under the same
license terms as Ruby.
=end
#MODIFIED
# removed include GetText etc
# added stub translation method _(x)
require 'racc/parser'
module GetText
class PoParser < Racc::Parser
def _(x)
x
end
module_eval <<'..end src/poparser.ry modeval..id7a99570e05', 'src/poparser.ry', 108
def unescape(orig)
ret = orig.gsub(/\\n/, "\n")
ret.gsub!(/\\t/, "\t")
ret.gsub!(/\\r/, "\r")
ret.gsub!(/\\"/, "\"")
ret
end
def parse(str, data, ignore_fuzzy = true)
@comments = []
@data = data
@fuzzy = false
@msgctxt = ""
$ignore_fuzzy = ignore_fuzzy
str.strip!
@q = []
until str.empty? do
case str
when /\A\s+/
str = $'
when /\Amsgctxt/
@q.push [:MSGCTXT, $&]
str = $'
when /\Amsgid_plural/
@q.push [:MSGID_PLURAL, $&]
str = $'
when /\Amsgid/
@q.push [:MSGID, $&]
str = $'
when /\Amsgstr/
@q.push [:MSGSTR, $&]
str = $'
when /\A\[(\d+)\]/
@q.push [:PLURAL_NUM, $1]
str = $'
when /\A\#~(.*)/
$stderr.print _("Warning: obsolete msgid exists.\n")
$stderr.print " #{$&}\n"
@q.push [:COMMENT, $&]
str = $'
when /\A\#(.*)/
@q.push [:COMMENT, $&]
str = $'
when /\A\"(.*)\"/
@q.push [:STRING, $1]
str = $'
else
#c = str[0,1]
#@q.push [:STRING, c]
str = str[1..-1]
end
end
@q.push [false, '$end']
if $DEBUG
@q.each do |a,b|
puts "[#{a}, #{b}]"
end
end
@yydebug = true if $DEBUG
do_parse
if @comments.size > 0
@data.set_comment(:last, @comments.join("\n"))
end
@data
end
def next_token
@q.shift
end
def on_message(msgid, msgstr)
if msgstr.size > 0
@data[msgid] = msgstr
@data.set_comment(msgid, @comments.join("\n"))
end
@comments.clear
@msgctxt = ""
end
def on_comment(comment)
@fuzzy = true if (/fuzzy/ =~ comment)
@comments << comment
end
..end src/poparser.ry modeval..id7a99570e05
##### racc 1.4.5 generates ###
racc_reduce_table = [
0, 0, :racc_error,
0, 10, :_reduce_none,
2, 10, :_reduce_none,
2, 10, :_reduce_none,
2, 10, :_reduce_none,
2, 12, :_reduce_5,
1, 13, :_reduce_none,
1, 13, :_reduce_none,
4, 15, :_reduce_8,
5, 16, :_reduce_9,
2, 17, :_reduce_10,
1, 17, :_reduce_none,
3, 18, :_reduce_12,
1, 11, :_reduce_13,
2, 14, :_reduce_14,
1, 14, :_reduce_15 ]
racc_reduce_n = 16
racc_shift_n = 26
racc_action_table = [
3, 13, 5, 7, 9, 15, 16, 17, 20, 17,
13, 17, 13, 13, 11, 17, 23, 20, 13, 17 ]
racc_action_check = [
1, 16, 1, 1, 1, 12, 12, 12, 18, 18,
7, 14, 15, 9, 3, 19, 20, 21, 23, 25 ]
racc_action_pointer = [
nil, 0, nil, 14, nil, nil, nil, 3, nil, 6,
nil, nil, 0, nil, 4, 5, -6, nil, 2, 8,
8, 11, nil, 11, nil, 12 ]
racc_action_default = [
-1, -16, -2, -16, -3, -13, -4, -16, -6, -16,
-7, 26, -16, -15, -5, -16, -16, -14, -16, -8,
-16, -9, -11, -16, -10, -12 ]
racc_goto_table = [
12, 22, 14, 4, 24, 6, 2, 8, 18, 19,
10, 21, 1, nil, nil, nil, 25 ]
racc_goto_check = [
5, 9, 5, 3, 9, 4, 2, 6, 5, 5,
7, 8, 1, nil, nil, nil, 5 ]
racc_goto_pointer = [
nil, 12, 5, 2, 4, -7, 6, 9, -7, -17 ]
racc_goto_default = [
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil ]
racc_token_table = {
false => 0,
Object.new => 1,
:COMMENT => 2,
:MSGID => 3,
:MSGCTXT => 4,
:MSGID_PLURAL => 5,
:MSGSTR => 6,
:STRING => 7,
:PLURAL_NUM => 8 }
racc_use_result_var = true
racc_nt_base = 9
Racc_arg = [
racc_action_table,
racc_action_check,
racc_action_default,
racc_action_pointer,
racc_goto_table,
racc_goto_check,
racc_goto_default,
racc_goto_pointer,
racc_nt_base,
racc_reduce_table,
racc_token_table,
racc_shift_n,
racc_reduce_n,
racc_use_result_var ]
Racc_token_to_s_table = [
'$end',
'error',
'COMMENT',
'MSGID',
'MSGCTXT',
'MSGID_PLURAL',
'MSGSTR',
'STRING',
'PLURAL_NUM',
'$start',
'msgfmt',
'comment',
'msgctxt',
'message',
'string_list',
'single_message',
'plural_message',
'msgstr_plural',
'msgstr_plural_line']
Racc_debug_parser = true
##### racc system variables end #####
# reduce 0 omitted
# reduce 1 omitted
# reduce 2 omitted
# reduce 3 omitted
# reduce 4 omitted
module_eval <<'.,.,', 'src/poparser.ry', 25
def _reduce_5( val, _values, result )
@msgctxt = unescape(val[1]) + "\004"
result
end
.,.,
# reduce 6 omitted
# reduce 7 omitted
module_eval <<'.,.,', 'src/poparser.ry', 48
def _reduce_8( val, _values, result )
if @fuzzy and $ignore_fuzzy
if val[1] != ""
$stderr.print _("Warning: fuzzy message was ignored.\n")
$stderr.print " msgid '#{val[1]}'\n"
else
on_message('', unescape(val[3]))
end
@fuzzy = false
else
on_message(@msgctxt + unescape(val[1]), unescape(val[3]))
end
result = ""
result
end
.,.,
module_eval <<'.,.,', 'src/poparser.ry', 65
def _reduce_9( val, _values, result )
if @fuzzy and $ignore_fuzzy
if val[1] != ""
$stderr.print _("Warning: fuzzy message was ignored.\n")
$stderr.print "msgid = '#{val[1]}\n"
else
on_message('', unescape(val[3]))
end
@fuzzy = false
else
on_message(@msgctxt + unescape(val[1]) + "\000" + unescape(val[3]), unescape(val[4]))
end
result = ""
result
end
.,.,
module_eval <<'.,.,', 'src/poparser.ry', 76
def _reduce_10( val, _values, result )
if val[0].size > 0
result = val[0] + "\000" + val[1]
else
result = ""
end
result
end
.,.,
# reduce 11 omitted
module_eval <<'.,.,', 'src/poparser.ry', 84
def _reduce_12( val, _values, result )
result = val[2]
result
end
.,.,
module_eval <<'.,.,', 'src/poparser.ry', 91
def _reduce_13( val, _values, result )
on_comment(val[0])
result
end
.,.,
module_eval <<'.,.,', 'src/poparser.ry', 99
def _reduce_14( val, _values, result )
result = val.delete_if{|item| item == ""}.join
result
end
.,.,
module_eval <<'.,.,', 'src/poparser.ry', 103
def _reduce_15( val, _values, result )
result = val[0]
result
end
.,.,
def _reduce_none( val, _values, result )
result
end
end # class PoParser
end # module GetText

View File

@@ -1,6 +0,0 @@
module I18n
module Locale
autoload :Fallbacks, 'i18n/locale/fallbacks'
autoload :Tag, 'i18n/locale/tag'
end
end

View File

@@ -1,98 +0,0 @@
# encoding: utf-8
# Locale Fallbacks
#
# Extends the I18n module to hold a fallbacks instance which is set to an
# instance of I18n::Locale::Fallbacks by default but can be swapped with a
# different implementation.
#
# Locale fallbacks will compute a number of fallback locales for a given locale.
# For example:
#
# <pre><code>
# I18n.fallbacks[:"es-MX"] # => [:"es-MX", :es, :en] </code></pre>
#
# Locale fallbacks always fall back to
#
# * all parent locales of a given locale (e.g. :es for :"es-MX") first,
# * the current default locales and all of their parents second
#
# The default locales are set to [I18n.default_locale] by default but can be
# set to something else.
#
# One can additionally add any number of additional fallback locales manually.
# These will be added before the default locales to the fallback chain. For
# example:
#
# # using the default locale as default fallback locale
#
# I18n.default_locale = :"en-US"
# I18n.fallbacks = I18n::Fallbacks.new(:"de-AT" => :"de-DE")
# I18n.fallbacks[:"de-AT"] # => [:"de-AT", :"de-DE", :de, :"en-US", :en]
#
# # using a custom locale as default fallback locale
#
# I18n.fallbacks = I18n::Fallbacks.new(:"en-GB", :"de-AT" => :de, :"de-CH" => :de)
# I18n.fallbacks[:"de-AT"] # => [:"de-AT", :de, :"en-GB", :en]
# I18n.fallbacks[:"de-CH"] # => [:"de-CH", :de, :"en-GB", :en]
#
# # mapping fallbacks to an existing instance
#
# # people speaking Catalan also speak Spanish as spoken in Spain
# fallbacks = I18n.fallbacks
# fallbacks.map(:ca => :"es-ES")
# fallbacks[:ca] # => [:ca, :"es-ES", :es, :"en-US", :en]
#
# # people speaking Arabian as spoken in Palestine also speak Hebrew as spoken in Israel
# fallbacks.map(:"ar-PS" => :"he-IL")
# fallbacks[:"ar-PS"] # => [:"ar-PS", :ar, :"he-IL", :he, :"en-US", :en]
# fallbacks[:"ar-EG"] # => [:"ar-EG", :ar, :"en-US", :en]
#
# # people speaking Sami as spoken in Finnland also speak Swedish and Finnish as spoken in Finnland
# fallbacks.map(:sms => [:"se-FI", :"fi-FI"])
# fallbacks[:sms] # => [:sms, :"se-FI", :se, :"fi-FI", :fi, :"en-US", :en]
module I18n
module Locale
class Fallbacks < Hash
def initialize(*mappings)
@map = {}
map(mappings.pop) if mappings.last.is_a?(Hash)
self.defaults = mappings.empty? ? [I18n.default_locale.to_sym] : mappings
end
def defaults=(defaults)
@defaults = defaults.map { |default| compute(default, false) }.flatten
end
attr_reader :defaults
def [](locale)
raise InvalidLocale.new(locale) if locale.nil?
locale = locale.to_sym
super || store(locale, compute(locale))
end
def map(mappings)
mappings.each do |from, to|
from, to = from.to_sym, Array(to)
to.each do |to|
@map[from] ||= []
@map[from] << to.to_sym
end
end
end
protected
def compute(tags, include_defaults = true)
result = Array(tags).collect do |tag|
tags = I18n::Locale::Tag.tag(tag).self_and_parents.map! { |t| t.to_sym }
tags.each { |tag| tags += compute(@map[tag]) if @map[tag] }
tags
end.flatten
result.push(*defaults) if include_defaults
result.uniq
end
end
end
end

View File

@@ -1,28 +0,0 @@
# encoding: utf-8
module I18n
module Locale
module Tag
autoload :Parents, 'i18n/locale/tag/parents'
autoload :Rfc4646, 'i18n/locale/tag/rfc4646'
autoload :Simple, 'i18n/locale/tag/simple'
class << self
# Returns the current locale tag implementation. Defaults to +I18n::Locale::Tag::Simple+.
def implementation
@@implementation ||= Simple
end
# Sets the current locale tag implementation. Use this to set a different locale tag implementation.
def implementation=(implementation)
@@implementation = implementation
end
# Factory method for locale tags. Delegates to the current locale tag implementation.
def tag(tag)
implementation.tag(tag)
end
end
end
end
end

View File

@@ -1,24 +0,0 @@
# encoding: utf-8
module I18n
module Locale
module Tag
module Parents
def parent
@parent ||= begin
segs = to_a.compact
segs.length > 1 ? self.class.tag(*segs[0..(segs.length-2)].join('-')) : nil
end
end
def self_and_parents
@self_and_parents ||= [self] + parents
end
def parents
@parents ||= ([parent] + (parent ? parent.parents : [])).compact
end
end
end
end
end

View File

@@ -1,76 +0,0 @@
# encoding: utf-8
# RFC 4646/47 compliant Locale tag implementation that parses locale tags to
# subtags such as language, script, region, variant etc.
#
# For more information see by http://en.wikipedia.org/wiki/IETF_language_tag
#
# Rfc4646::Parser does not implement grandfathered tags.
module I18n
module Locale
module Tag
RFC4646_SUBTAGS = [ :language, :script, :region, :variant, :extension, :privateuse, :grandfathered ]
RFC4646_FORMATS = { :language => :downcase, :script => :capitalize, :region => :upcase, :variant => :downcase }
class Rfc4646 < Struct.new(*RFC4646_SUBTAGS)
class << self
# Parses the given tag and returns a Tag instance if it is valid.
# Returns false if the given tag is not valid according to RFC 4646.
def tag(tag)
matches = parser.match(tag)
new(*matches) if matches
end
def parser
@@parser ||= Rfc4646::Parser
end
def parser=(parser)
@@parser = parser
end
end
include Parents
RFC4646_FORMATS.each do |name, format|
define_method(name) { self[name].send(format) unless self[name].nil? }
end
def to_sym
to_s.to_sym
end
def to_s
@tag ||= to_a.compact.join("-")
end
def to_a
members.collect { |attr| self.send(attr) }
end
module Parser
PATTERN = %r{\A(?:
([a-z]{2,3}(?:(?:-[a-z]{3}){0,3})?|[a-z]{4}|[a-z]{5,8}) # language
(?:-([a-z]{4}))? # script
(?:-([a-z]{2}|\d{3}))? # region
(?:-([0-9a-z]{5,8}|\d[0-9a-z]{3}))* # variant
(?:-([0-9a-wyz](?:-[0-9a-z]{2,8})+))* # extension
(?:-(x(?:-[0-9a-z]{1,8})+))?| # privateuse subtag
(x(?:-[0-9a-z]{1,8})+)| # privateuse tag
/* ([a-z]{1,3}(?:-[0-9a-z]{2,8}){1,2}) */ # grandfathered
)\z}xi
class << self
def match(tag)
c = PATTERN.match(tag.to_s).captures
c[0..4] << (c[5].nil? ? c[6] : c[5]) << c[7] # TODO c[7] is grandfathered, throw a NotImplemented exception here?
rescue
false
end
end
end
end
end
end
end

View File

@@ -1,41 +0,0 @@
# encoding: utf-8
# Simple Locale tag implementation that computes subtags by simply splitting
# the locale tag at '-' occurences.
module I18n
module Locale
module Tag
class Simple
class << self
def tag(tag)
new(tag)
end
end
include Parents
attr_reader :tag
def initialize(*tag)
@tag = tag.join('-').to_sym
end
def subtags
@subtags = tag.to_s.split('-').map { |subtag| subtag.to_s }
end
def to_sym
tag
end
def to_s
tag.to_s
end
def to_a
subtags
end
end
end
end
end

View File

@@ -1,3 +0,0 @@
module I18n
VERSION = "0.4.1"
end

View File

@@ -1,30 +0,0 @@
require "tzinfo/data_timezone_info"
require "tzinfo/linked_timezone_info"
require "tzinfo/timezone_definition"
module TZInfo
module Definitions
def self.load_all!
return true if @loaded
@loaded = true
defns = Marshal.load(File.read(File.expand_path("../definitions.dump", __FILE__)))
defns.each do |defn|
tz_mod = defn.instance_variable_get(:@identifier).split("/").reduce(TZInfo::Definitions) { |mod, name|
if mod.const_defined?(name)
mod.const_get(name)
else
mod.const_set(name, Module.new)
end
}
def tz_mod.get
@timezone
end
tz_mod.instance_variable_set(:@timezone, defn)
end
end
end
end

View File

@@ -1,40 +0,0 @@
require 'tzinfo/timezone_definition'
module TZInfo
module Definitions
module Africa
module Casablanca
include TimezoneDefinition
timezone 'Africa/Casablanca' do |tz|
tz.offset :o0, -1820, 0, :LMT
tz.offset :o1, 0, 0, :WET
tz.offset :o2, 0, 3600, :WEST
tz.offset :o3, 3600, 0, :CET
tz.transition 1913, 10, :o1, 10454687371, 4320
tz.transition 1939, 9, :o2, 4859037, 2
tz.transition 1939, 11, :o1, 58310075, 24
tz.transition 1940, 2, :o2, 4859369, 2
tz.transition 1945, 11, :o1, 58362659, 24
tz.transition 1950, 6, :o2, 4866887, 2
tz.transition 1950, 10, :o1, 58406003, 24
tz.transition 1967, 6, :o2, 2439645, 1
tz.transition 1967, 9, :o1, 58554347, 24
tz.transition 1974, 6, :o2, 141264000
tz.transition 1974, 8, :o1, 147222000
tz.transition 1976, 5, :o2, 199756800
tz.transition 1976, 7, :o1, 207702000
tz.transition 1977, 5, :o2, 231292800
tz.transition 1977, 9, :o1, 244249200
tz.transition 1978, 6, :o2, 265507200
tz.transition 1978, 8, :o1, 271033200
tz.transition 1984, 3, :o3, 448243200
tz.transition 1985, 12, :o1, 504918000
tz.transition 2008, 6, :o2, 1212278400
tz.transition 2008, 8, :o1, 1220223600
end
end
end
end
end

View File

@@ -1,166 +0,0 @@
require 'tzinfo/timezone_definition'
module TZInfo
module Definitions
module America
module Argentina
module Buenos_Aires
include TimezoneDefinition
timezone 'America/Argentina/Buenos_Aires' do |tz|
tz.offset :o0, -14028, 0, :LMT
tz.offset :o1, -15408, 0, :CMT
tz.offset :o2, -14400, 0, :ART
tz.offset :o3, -14400, 3600, :ARST
tz.offset :o4, -10800, 0, :ART
tz.offset :o5, -10800, 3600, :ARST
tz.transition 1894, 10, :o1, 17374555169, 7200
tz.transition 1920, 5, :o2, 1453467407, 600
tz.transition 1930, 12, :o3, 7278935, 3
tz.transition 1931, 4, :o2, 19411461, 8
tz.transition 1931, 10, :o3, 7279889, 3
tz.transition 1932, 3, :o2, 19414141, 8
tz.transition 1932, 11, :o3, 7281038, 3
tz.transition 1933, 3, :o2, 19417061, 8
tz.transition 1933, 11, :o3, 7282133, 3
tz.transition 1934, 3, :o2, 19419981, 8
tz.transition 1934, 11, :o3, 7283228, 3
tz.transition 1935, 3, :o2, 19422901, 8
tz.transition 1935, 11, :o3, 7284323, 3
tz.transition 1936, 3, :o2, 19425829, 8
tz.transition 1936, 11, :o3, 7285421, 3
tz.transition 1937, 3, :o2, 19428749, 8
tz.transition 1937, 11, :o3, 7286516, 3
tz.transition 1938, 3, :o2, 19431669, 8
tz.transition 1938, 11, :o3, 7287611, 3
tz.transition 1939, 3, :o2, 19434589, 8
tz.transition 1939, 11, :o3, 7288706, 3
tz.transition 1940, 3, :o2, 19437517, 8
tz.transition 1940, 7, :o3, 7289435, 3
tz.transition 1941, 6, :o2, 19441285, 8
tz.transition 1941, 10, :o3, 7290848, 3
tz.transition 1943, 8, :o2, 19447501, 8
tz.transition 1943, 10, :o3, 7293038, 3
tz.transition 1946, 3, :o2, 19455045, 8
tz.transition 1946, 10, :o3, 7296284, 3
tz.transition 1963, 10, :o2, 19506429, 8
tz.transition 1963, 12, :o3, 7315136, 3
tz.transition 1964, 3, :o2, 19507645, 8
tz.transition 1964, 10, :o3, 7316051, 3
tz.transition 1965, 3, :o2, 19510565, 8
tz.transition 1965, 10, :o3, 7317146, 3
tz.transition 1966, 3, :o2, 19513485, 8
tz.transition 1966, 10, :o3, 7318241, 3
tz.transition 1967, 4, :o2, 19516661, 8
tz.transition 1967, 10, :o3, 7319294, 3
tz.transition 1968, 4, :o2, 19519629, 8
tz.transition 1968, 10, :o3, 7320407, 3
tz.transition 1969, 4, :o2, 19522541, 8
tz.transition 1969, 10, :o4, 7321499, 3
tz.transition 1974, 1, :o5, 128142000
tz.transition 1974, 5, :o4, 136605600
tz.transition 1988, 12, :o5, 596948400
tz.transition 1989, 3, :o4, 605066400
tz.transition 1989, 10, :o5, 624423600
tz.transition 1990, 3, :o4, 636516000
tz.transition 1990, 10, :o5, 656478000
tz.transition 1991, 3, :o4, 667965600
tz.transition 1991, 10, :o5, 687927600
tz.transition 1992, 3, :o4, 699415200
tz.transition 1992, 10, :o5, 719377200
tz.transition 1993, 3, :o4, 731469600
tz.transition 1999, 10, :o3, 938919600
tz.transition 2000, 3, :o4, 952052400
tz.transition 2007, 12, :o5, 1198983600
tz.transition 2008, 3, :o4, 1205632800
tz.transition 2008, 10, :o5, 1224385200
tz.transition 2009, 3, :o4, 1237082400
tz.transition 2009, 10, :o5, 1255834800
tz.transition 2010, 3, :o4, 1269136800
tz.transition 2010, 10, :o5, 1287284400
tz.transition 2011, 3, :o4, 1300586400
tz.transition 2011, 10, :o5, 1318734000
tz.transition 2012, 3, :o4, 1332036000
tz.transition 2012, 10, :o5, 1350788400
tz.transition 2013, 3, :o4, 1363485600
tz.transition 2013, 10, :o5, 1382238000
tz.transition 2014, 3, :o4, 1394935200
tz.transition 2014, 10, :o5, 1413687600
tz.transition 2015, 3, :o4, 1426384800
tz.transition 2015, 10, :o5, 1445137200
tz.transition 2016, 3, :o4, 1458439200
tz.transition 2016, 10, :o5, 1476586800
tz.transition 2017, 3, :o4, 1489888800
tz.transition 2017, 10, :o5, 1508036400
tz.transition 2018, 3, :o4, 1521338400
tz.transition 2018, 10, :o5, 1540090800
tz.transition 2019, 3, :o4, 1552788000
tz.transition 2019, 10, :o5, 1571540400
tz.transition 2020, 3, :o4, 1584237600
tz.transition 2020, 10, :o5, 1602990000
tz.transition 2021, 3, :o4, 1616292000
tz.transition 2021, 10, :o5, 1634439600
tz.transition 2022, 3, :o4, 1647741600
tz.transition 2022, 10, :o5, 1665889200
tz.transition 2023, 3, :o4, 1679191200
tz.transition 2023, 10, :o5, 1697338800
tz.transition 2024, 3, :o4, 1710640800
tz.transition 2024, 10, :o5, 1729393200
tz.transition 2025, 3, :o4, 1742090400
tz.transition 2025, 10, :o5, 1760842800
tz.transition 2026, 3, :o4, 1773540000
tz.transition 2026, 10, :o5, 1792292400
tz.transition 2027, 3, :o4, 1805594400
tz.transition 2027, 10, :o5, 1823742000
tz.transition 2028, 3, :o4, 1837044000
tz.transition 2028, 10, :o5, 1855191600
tz.transition 2029, 3, :o4, 1868493600
tz.transition 2029, 10, :o5, 1887246000
tz.transition 2030, 3, :o4, 1899943200
tz.transition 2030, 10, :o5, 1918695600
tz.transition 2031, 3, :o4, 1931392800
tz.transition 2031, 10, :o5, 1950145200
tz.transition 2032, 3, :o4, 1963447200
tz.transition 2032, 10, :o5, 1981594800
tz.transition 2033, 3, :o4, 1994896800
tz.transition 2033, 10, :o5, 2013044400
tz.transition 2034, 3, :o4, 2026346400
tz.transition 2034, 10, :o5, 2044494000
tz.transition 2035, 3, :o4, 2057796000
tz.transition 2035, 10, :o5, 2076548400
tz.transition 2036, 3, :o4, 2089245600
tz.transition 2036, 10, :o5, 2107998000
tz.transition 2037, 3, :o4, 2120695200
tz.transition 2037, 10, :o5, 2139447600
tz.transition 2038, 3, :o4, 29586043, 12
tz.transition 2038, 10, :o5, 19725709, 8
tz.transition 2039, 3, :o4, 29590411, 12
tz.transition 2039, 10, :o5, 19728621, 8
tz.transition 2040, 3, :o4, 29594779, 12
tz.transition 2040, 10, :o5, 19731589, 8
tz.transition 2041, 3, :o4, 29599147, 12
tz.transition 2041, 10, :o5, 19734501, 8
tz.transition 2042, 3, :o4, 29603515, 12
tz.transition 2042, 10, :o5, 19737413, 8
tz.transition 2043, 3, :o4, 29607883, 12
tz.transition 2043, 10, :o5, 19740325, 8
tz.transition 2044, 3, :o4, 29612335, 12
tz.transition 2044, 10, :o5, 19743237, 8
tz.transition 2045, 3, :o4, 29616703, 12
tz.transition 2045, 10, :o5, 19746149, 8
tz.transition 2046, 3, :o4, 29621071, 12
tz.transition 2046, 10, :o5, 19749117, 8
tz.transition 2047, 3, :o4, 29625439, 12
tz.transition 2047, 10, :o5, 19752029, 8
tz.transition 2048, 3, :o4, 29629807, 12
tz.transition 2048, 10, :o5, 19754941, 8
tz.transition 2049, 3, :o4, 29634259, 12
tz.transition 2049, 10, :o5, 19757853, 8
tz.transition 2050, 3, :o4, 29638627, 12
end
end
end
end
end
end

View File

@@ -1,165 +0,0 @@
require 'tzinfo/timezone_definition'
module TZInfo
module Definitions
module Asia
module Irkutsk
include TimezoneDefinition
timezone 'Asia/Irkutsk' do |tz|
tz.offset :o0, 25040, 0, :LMT
tz.offset :o1, 25040, 0, :IMT
tz.offset :o2, 25200, 0, :IRKT
tz.offset :o3, 28800, 0, :IRKT
tz.offset :o4, 28800, 3600, :IRKST
tz.offset :o5, 25200, 3600, :IRKST
tz.transition 1879, 12, :o1, 2600332427, 1080
tz.transition 1920, 1, :o2, 2616136067, 1080
tz.transition 1930, 6, :o3, 58227557, 24
tz.transition 1981, 3, :o4, 354902400
tz.transition 1981, 9, :o3, 370710000
tz.transition 1982, 3, :o4, 386438400
tz.transition 1982, 9, :o3, 402246000
tz.transition 1983, 3, :o4, 417974400
tz.transition 1983, 9, :o3, 433782000
tz.transition 1984, 3, :o4, 449596800
tz.transition 1984, 9, :o3, 465328800
tz.transition 1985, 3, :o4, 481053600
tz.transition 1985, 9, :o3, 496778400
tz.transition 1986, 3, :o4, 512503200
tz.transition 1986, 9, :o3, 528228000
tz.transition 1987, 3, :o4, 543952800
tz.transition 1987, 9, :o3, 559677600
tz.transition 1988, 3, :o4, 575402400
tz.transition 1988, 9, :o3, 591127200
tz.transition 1989, 3, :o4, 606852000
tz.transition 1989, 9, :o3, 622576800
tz.transition 1990, 3, :o4, 638301600
tz.transition 1990, 9, :o3, 654631200
tz.transition 1991, 3, :o5, 670356000
tz.transition 1991, 9, :o2, 686084400
tz.transition 1992, 1, :o3, 695761200
tz.transition 1992, 3, :o4, 701794800
tz.transition 1992, 9, :o3, 717516000
tz.transition 1993, 3, :o4, 733255200
tz.transition 1993, 9, :o3, 748980000
tz.transition 1994, 3, :o4, 764704800
tz.transition 1994, 9, :o3, 780429600
tz.transition 1995, 3, :o4, 796154400
tz.transition 1995, 9, :o3, 811879200
tz.transition 1996, 3, :o4, 828208800
tz.transition 1996, 10, :o3, 846352800
tz.transition 1997, 3, :o4, 859658400
tz.transition 1997, 10, :o3, 877802400
tz.transition 1998, 3, :o4, 891108000
tz.transition 1998, 10, :o3, 909252000
tz.transition 1999, 3, :o4, 922557600
tz.transition 1999, 10, :o3, 941306400
tz.transition 2000, 3, :o4, 954007200
tz.transition 2000, 10, :o3, 972756000
tz.transition 2001, 3, :o4, 985456800
tz.transition 2001, 10, :o3, 1004205600
tz.transition 2002, 3, :o4, 1017511200
tz.transition 2002, 10, :o3, 1035655200
tz.transition 2003, 3, :o4, 1048960800
tz.transition 2003, 10, :o3, 1067104800
tz.transition 2004, 3, :o4, 1080410400
tz.transition 2004, 10, :o3, 1099159200
tz.transition 2005, 3, :o4, 1111860000
tz.transition 2005, 10, :o3, 1130608800
tz.transition 2006, 3, :o4, 1143309600
tz.transition 2006, 10, :o3, 1162058400
tz.transition 2007, 3, :o4, 1174759200
tz.transition 2007, 10, :o3, 1193508000
tz.transition 2008, 3, :o4, 1206813600
tz.transition 2008, 10, :o3, 1224957600
tz.transition 2009, 3, :o4, 1238263200
tz.transition 2009, 10, :o3, 1256407200
tz.transition 2010, 3, :o4, 1269712800
tz.transition 2010, 10, :o3, 1288461600
tz.transition 2011, 3, :o4, 1301162400
tz.transition 2011, 10, :o3, 1319911200
tz.transition 2012, 3, :o4, 1332612000
tz.transition 2012, 10, :o3, 1351360800
tz.transition 2013, 3, :o4, 1364666400
tz.transition 2013, 10, :o3, 1382810400
tz.transition 2014, 3, :o4, 1396116000
tz.transition 2014, 10, :o3, 1414260000
tz.transition 2015, 3, :o4, 1427565600
tz.transition 2015, 10, :o3, 1445709600
tz.transition 2016, 3, :o4, 1459015200
tz.transition 2016, 10, :o3, 1477764000
tz.transition 2017, 3, :o4, 1490464800
tz.transition 2017, 10, :o3, 1509213600
tz.transition 2018, 3, :o4, 1521914400
tz.transition 2018, 10, :o3, 1540663200
tz.transition 2019, 3, :o4, 1553968800
tz.transition 2019, 10, :o3, 1572112800
tz.transition 2020, 3, :o4, 1585418400
tz.transition 2020, 10, :o3, 1603562400
tz.transition 2021, 3, :o4, 1616868000
tz.transition 2021, 10, :o3, 1635616800
tz.transition 2022, 3, :o4, 1648317600
tz.transition 2022, 10, :o3, 1667066400
tz.transition 2023, 3, :o4, 1679767200
tz.transition 2023, 10, :o3, 1698516000
tz.transition 2024, 3, :o4, 1711821600
tz.transition 2024, 10, :o3, 1729965600
tz.transition 2025, 3, :o4, 1743271200
tz.transition 2025, 10, :o3, 1761415200
tz.transition 2026, 3, :o4, 1774720800
tz.transition 2026, 10, :o3, 1792864800
tz.transition 2027, 3, :o4, 1806170400
tz.transition 2027, 10, :o3, 1824919200
tz.transition 2028, 3, :o4, 1837620000
tz.transition 2028, 10, :o3, 1856368800
tz.transition 2029, 3, :o4, 1869069600
tz.transition 2029, 10, :o3, 1887818400
tz.transition 2030, 3, :o4, 1901124000
tz.transition 2030, 10, :o3, 1919268000
tz.transition 2031, 3, :o4, 1932573600
tz.transition 2031, 10, :o3, 1950717600
tz.transition 2032, 3, :o4, 1964023200
tz.transition 2032, 10, :o3, 1982772000
tz.transition 2033, 3, :o4, 1995472800
tz.transition 2033, 10, :o3, 2014221600
tz.transition 2034, 3, :o4, 2026922400
tz.transition 2034, 10, :o3, 2045671200
tz.transition 2035, 3, :o4, 2058372000
tz.transition 2035, 10, :o3, 2077120800
tz.transition 2036, 3, :o4, 2090426400
tz.transition 2036, 10, :o3, 2108570400
tz.transition 2037, 3, :o4, 2121876000
tz.transition 2037, 10, :o3, 2140020000
tz.transition 2038, 3, :o4, 9862041, 4
tz.transition 2038, 10, :o3, 9862909, 4
tz.transition 2039, 3, :o4, 9863497, 4
tz.transition 2039, 10, :o3, 9864365, 4
tz.transition 2040, 3, :o4, 9864953, 4
tz.transition 2040, 10, :o3, 9865821, 4
tz.transition 2041, 3, :o4, 9866437, 4
tz.transition 2041, 10, :o3, 9867277, 4
tz.transition 2042, 3, :o4, 9867893, 4
tz.transition 2042, 10, :o3, 9868733, 4
tz.transition 2043, 3, :o4, 9869349, 4
tz.transition 2043, 10, :o3, 9870189, 4
tz.transition 2044, 3, :o4, 9870805, 4
tz.transition 2044, 10, :o3, 9871673, 4
tz.transition 2045, 3, :o4, 9872261, 4
tz.transition 2045, 10, :o3, 9873129, 4
tz.transition 2046, 3, :o4, 9873717, 4
tz.transition 2046, 10, :o3, 9874585, 4
tz.transition 2047, 3, :o4, 9875201, 4
tz.transition 2047, 10, :o3, 9876041, 4
tz.transition 2048, 3, :o4, 9876657, 4
tz.transition 2048, 10, :o3, 9877497, 4
tz.transition 2049, 3, :o4, 9878113, 4
tz.transition 2049, 10, :o3, 9878981, 4
tz.transition 2050, 3, :o4, 9879569, 4
tz.transition 2050, 10, :o3, 9880437, 4
end
end
end
end
end

View File

@@ -1,163 +0,0 @@
require 'tzinfo/timezone_definition'
module TZInfo
module Definitions
module Asia
module Kamchatka
include TimezoneDefinition
timezone 'Asia/Kamchatka' do |tz|
tz.offset :o0, 38076, 0, :LMT
tz.offset :o1, 39600, 0, :PETT
tz.offset :o2, 43200, 0, :PETT
tz.offset :o3, 43200, 3600, :PETST
tz.offset :o4, 39600, 3600, :PETST
tz.transition 1922, 11, :o1, 17448250027, 7200
tz.transition 1930, 6, :o2, 58227553, 24
tz.transition 1981, 3, :o3, 354888000
tz.transition 1981, 9, :o2, 370695600
tz.transition 1982, 3, :o3, 386424000
tz.transition 1982, 9, :o2, 402231600
tz.transition 1983, 3, :o3, 417960000
tz.transition 1983, 9, :o2, 433767600
tz.transition 1984, 3, :o3, 449582400
tz.transition 1984, 9, :o2, 465314400
tz.transition 1985, 3, :o3, 481039200
tz.transition 1985, 9, :o2, 496764000
tz.transition 1986, 3, :o3, 512488800
tz.transition 1986, 9, :o2, 528213600
tz.transition 1987, 3, :o3, 543938400
tz.transition 1987, 9, :o2, 559663200
tz.transition 1988, 3, :o3, 575388000
tz.transition 1988, 9, :o2, 591112800
tz.transition 1989, 3, :o3, 606837600
tz.transition 1989, 9, :o2, 622562400
tz.transition 1990, 3, :o3, 638287200
tz.transition 1990, 9, :o2, 654616800
tz.transition 1991, 3, :o4, 670341600
tz.transition 1991, 9, :o1, 686070000
tz.transition 1992, 1, :o2, 695746800
tz.transition 1992, 3, :o3, 701780400
tz.transition 1992, 9, :o2, 717501600
tz.transition 1993, 3, :o3, 733240800
tz.transition 1993, 9, :o2, 748965600
tz.transition 1994, 3, :o3, 764690400
tz.transition 1994, 9, :o2, 780415200
tz.transition 1995, 3, :o3, 796140000
tz.transition 1995, 9, :o2, 811864800
tz.transition 1996, 3, :o3, 828194400
tz.transition 1996, 10, :o2, 846338400
tz.transition 1997, 3, :o3, 859644000
tz.transition 1997, 10, :o2, 877788000
tz.transition 1998, 3, :o3, 891093600
tz.transition 1998, 10, :o2, 909237600
tz.transition 1999, 3, :o3, 922543200
tz.transition 1999, 10, :o2, 941292000
tz.transition 2000, 3, :o3, 953992800
tz.transition 2000, 10, :o2, 972741600
tz.transition 2001, 3, :o3, 985442400
tz.transition 2001, 10, :o2, 1004191200
tz.transition 2002, 3, :o3, 1017496800
tz.transition 2002, 10, :o2, 1035640800
tz.transition 2003, 3, :o3, 1048946400
tz.transition 2003, 10, :o2, 1067090400
tz.transition 2004, 3, :o3, 1080396000
tz.transition 2004, 10, :o2, 1099144800
tz.transition 2005, 3, :o3, 1111845600
tz.transition 2005, 10, :o2, 1130594400
tz.transition 2006, 3, :o3, 1143295200
tz.transition 2006, 10, :o2, 1162044000
tz.transition 2007, 3, :o3, 1174744800
tz.transition 2007, 10, :o2, 1193493600
tz.transition 2008, 3, :o3, 1206799200
tz.transition 2008, 10, :o2, 1224943200
tz.transition 2009, 3, :o3, 1238248800
tz.transition 2009, 10, :o2, 1256392800
tz.transition 2010, 3, :o3, 1269698400
tz.transition 2010, 10, :o2, 1288447200
tz.transition 2011, 3, :o3, 1301148000
tz.transition 2011, 10, :o2, 1319896800
tz.transition 2012, 3, :o3, 1332597600
tz.transition 2012, 10, :o2, 1351346400
tz.transition 2013, 3, :o3, 1364652000
tz.transition 2013, 10, :o2, 1382796000
tz.transition 2014, 3, :o3, 1396101600
tz.transition 2014, 10, :o2, 1414245600
tz.transition 2015, 3, :o3, 1427551200
tz.transition 2015, 10, :o2, 1445695200
tz.transition 2016, 3, :o3, 1459000800
tz.transition 2016, 10, :o2, 1477749600
tz.transition 2017, 3, :o3, 1490450400
tz.transition 2017, 10, :o2, 1509199200
tz.transition 2018, 3, :o3, 1521900000
tz.transition 2018, 10, :o2, 1540648800
tz.transition 2019, 3, :o3, 1553954400
tz.transition 2019, 10, :o2, 1572098400
tz.transition 2020, 3, :o3, 1585404000
tz.transition 2020, 10, :o2, 1603548000
tz.transition 2021, 3, :o3, 1616853600
tz.transition 2021, 10, :o2, 1635602400
tz.transition 2022, 3, :o3, 1648303200
tz.transition 2022, 10, :o2, 1667052000
tz.transition 2023, 3, :o3, 1679752800
tz.transition 2023, 10, :o2, 1698501600
tz.transition 2024, 3, :o3, 1711807200
tz.transition 2024, 10, :o2, 1729951200
tz.transition 2025, 3, :o3, 1743256800
tz.transition 2025, 10, :o2, 1761400800
tz.transition 2026, 3, :o3, 1774706400
tz.transition 2026, 10, :o2, 1792850400
tz.transition 2027, 3, :o3, 1806156000
tz.transition 2027, 10, :o2, 1824904800
tz.transition 2028, 3, :o3, 1837605600
tz.transition 2028, 10, :o2, 1856354400
tz.transition 2029, 3, :o3, 1869055200
tz.transition 2029, 10, :o2, 1887804000
tz.transition 2030, 3, :o3, 1901109600
tz.transition 2030, 10, :o2, 1919253600
tz.transition 2031, 3, :o3, 1932559200
tz.transition 2031, 10, :o2, 1950703200
tz.transition 2032, 3, :o3, 1964008800
tz.transition 2032, 10, :o2, 1982757600
tz.transition 2033, 3, :o3, 1995458400
tz.transition 2033, 10, :o2, 2014207200
tz.transition 2034, 3, :o3, 2026908000
tz.transition 2034, 10, :o2, 2045656800
tz.transition 2035, 3, :o3, 2058357600
tz.transition 2035, 10, :o2, 2077106400
tz.transition 2036, 3, :o3, 2090412000
tz.transition 2036, 10, :o2, 2108556000
tz.transition 2037, 3, :o3, 2121861600
tz.transition 2037, 10, :o2, 2140005600
tz.transition 2038, 3, :o3, 29586121, 12
tz.transition 2038, 10, :o2, 29588725, 12
tz.transition 2039, 3, :o3, 29590489, 12
tz.transition 2039, 10, :o2, 29593093, 12
tz.transition 2040, 3, :o3, 29594857, 12
tz.transition 2040, 10, :o2, 29597461, 12
tz.transition 2041, 3, :o3, 29599309, 12
tz.transition 2041, 10, :o2, 29601829, 12
tz.transition 2042, 3, :o3, 29603677, 12
tz.transition 2042, 10, :o2, 29606197, 12
tz.transition 2043, 3, :o3, 29608045, 12
tz.transition 2043, 10, :o2, 29610565, 12
tz.transition 2044, 3, :o3, 29612413, 12
tz.transition 2044, 10, :o2, 29615017, 12
tz.transition 2045, 3, :o3, 29616781, 12
tz.transition 2045, 10, :o2, 29619385, 12
tz.transition 2046, 3, :o3, 29621149, 12
tz.transition 2046, 10, :o2, 29623753, 12
tz.transition 2047, 3, :o3, 29625601, 12
tz.transition 2047, 10, :o2, 29628121, 12
tz.transition 2048, 3, :o3, 29629969, 12
tz.transition 2048, 10, :o2, 29632489, 12
tz.transition 2049, 3, :o3, 29634337, 12
tz.transition 2049, 10, :o2, 29636941, 12
tz.transition 2050, 3, :o3, 29638705, 12
tz.transition 2050, 10, :o2, 29641309, 12
end
end
end
end
end

View File

@@ -1,163 +0,0 @@
require 'tzinfo/timezone_definition'
module TZInfo
module Definitions
module Asia
module Krasnoyarsk
include TimezoneDefinition
timezone 'Asia/Krasnoyarsk' do |tz|
tz.offset :o0, 22280, 0, :LMT
tz.offset :o1, 21600, 0, :KRAT
tz.offset :o2, 25200, 0, :KRAT
tz.offset :o3, 25200, 3600, :KRAST
tz.offset :o4, 21600, 3600, :KRAST
tz.transition 1920, 1, :o1, 5232231163, 2160
tz.transition 1930, 6, :o2, 9704593, 4
tz.transition 1981, 3, :o3, 354906000
tz.transition 1981, 9, :o2, 370713600
tz.transition 1982, 3, :o3, 386442000
tz.transition 1982, 9, :o2, 402249600
tz.transition 1983, 3, :o3, 417978000
tz.transition 1983, 9, :o2, 433785600
tz.transition 1984, 3, :o3, 449600400
tz.transition 1984, 9, :o2, 465332400
tz.transition 1985, 3, :o3, 481057200
tz.transition 1985, 9, :o2, 496782000
tz.transition 1986, 3, :o3, 512506800
tz.transition 1986, 9, :o2, 528231600
tz.transition 1987, 3, :o3, 543956400
tz.transition 1987, 9, :o2, 559681200
tz.transition 1988, 3, :o3, 575406000
tz.transition 1988, 9, :o2, 591130800
tz.transition 1989, 3, :o3, 606855600
tz.transition 1989, 9, :o2, 622580400
tz.transition 1990, 3, :o3, 638305200
tz.transition 1990, 9, :o2, 654634800
tz.transition 1991, 3, :o4, 670359600
tz.transition 1991, 9, :o1, 686088000
tz.transition 1992, 1, :o2, 695764800
tz.transition 1992, 3, :o3, 701798400
tz.transition 1992, 9, :o2, 717519600
tz.transition 1993, 3, :o3, 733258800
tz.transition 1993, 9, :o2, 748983600
tz.transition 1994, 3, :o3, 764708400
tz.transition 1994, 9, :o2, 780433200
tz.transition 1995, 3, :o3, 796158000
tz.transition 1995, 9, :o2, 811882800
tz.transition 1996, 3, :o3, 828212400
tz.transition 1996, 10, :o2, 846356400
tz.transition 1997, 3, :o3, 859662000
tz.transition 1997, 10, :o2, 877806000
tz.transition 1998, 3, :o3, 891111600
tz.transition 1998, 10, :o2, 909255600
tz.transition 1999, 3, :o3, 922561200
tz.transition 1999, 10, :o2, 941310000
tz.transition 2000, 3, :o3, 954010800
tz.transition 2000, 10, :o2, 972759600
tz.transition 2001, 3, :o3, 985460400
tz.transition 2001, 10, :o2, 1004209200
tz.transition 2002, 3, :o3, 1017514800
tz.transition 2002, 10, :o2, 1035658800
tz.transition 2003, 3, :o3, 1048964400
tz.transition 2003, 10, :o2, 1067108400
tz.transition 2004, 3, :o3, 1080414000
tz.transition 2004, 10, :o2, 1099162800
tz.transition 2005, 3, :o3, 1111863600
tz.transition 2005, 10, :o2, 1130612400
tz.transition 2006, 3, :o3, 1143313200
tz.transition 2006, 10, :o2, 1162062000
tz.transition 2007, 3, :o3, 1174762800
tz.transition 2007, 10, :o2, 1193511600
tz.transition 2008, 3, :o3, 1206817200
tz.transition 2008, 10, :o2, 1224961200
tz.transition 2009, 3, :o3, 1238266800
tz.transition 2009, 10, :o2, 1256410800
tz.transition 2010, 3, :o3, 1269716400
tz.transition 2010, 10, :o2, 1288465200
tz.transition 2011, 3, :o3, 1301166000
tz.transition 2011, 10, :o2, 1319914800
tz.transition 2012, 3, :o3, 1332615600
tz.transition 2012, 10, :o2, 1351364400
tz.transition 2013, 3, :o3, 1364670000
tz.transition 2013, 10, :o2, 1382814000
tz.transition 2014, 3, :o3, 1396119600
tz.transition 2014, 10, :o2, 1414263600
tz.transition 2015, 3, :o3, 1427569200
tz.transition 2015, 10, :o2, 1445713200
tz.transition 2016, 3, :o3, 1459018800
tz.transition 2016, 10, :o2, 1477767600
tz.transition 2017, 3, :o3, 1490468400
tz.transition 2017, 10, :o2, 1509217200
tz.transition 2018, 3, :o3, 1521918000
tz.transition 2018, 10, :o2, 1540666800
tz.transition 2019, 3, :o3, 1553972400
tz.transition 2019, 10, :o2, 1572116400
tz.transition 2020, 3, :o3, 1585422000
tz.transition 2020, 10, :o2, 1603566000
tz.transition 2021, 3, :o3, 1616871600
tz.transition 2021, 10, :o2, 1635620400
tz.transition 2022, 3, :o3, 1648321200
tz.transition 2022, 10, :o2, 1667070000
tz.transition 2023, 3, :o3, 1679770800
tz.transition 2023, 10, :o2, 1698519600
tz.transition 2024, 3, :o3, 1711825200
tz.transition 2024, 10, :o2, 1729969200
tz.transition 2025, 3, :o3, 1743274800
tz.transition 2025, 10, :o2, 1761418800
tz.transition 2026, 3, :o3, 1774724400
tz.transition 2026, 10, :o2, 1792868400
tz.transition 2027, 3, :o3, 1806174000
tz.transition 2027, 10, :o2, 1824922800
tz.transition 2028, 3, :o3, 1837623600
tz.transition 2028, 10, :o2, 1856372400
tz.transition 2029, 3, :o3, 1869073200
tz.transition 2029, 10, :o2, 1887822000
tz.transition 2030, 3, :o3, 1901127600
tz.transition 2030, 10, :o2, 1919271600
tz.transition 2031, 3, :o3, 1932577200
tz.transition 2031, 10, :o2, 1950721200
tz.transition 2032, 3, :o3, 1964026800
tz.transition 2032, 10, :o2, 1982775600
tz.transition 2033, 3, :o3, 1995476400
tz.transition 2033, 10, :o2, 2014225200
tz.transition 2034, 3, :o3, 2026926000
tz.transition 2034, 10, :o2, 2045674800
tz.transition 2035, 3, :o3, 2058375600
tz.transition 2035, 10, :o2, 2077124400
tz.transition 2036, 3, :o3, 2090430000
tz.transition 2036, 10, :o2, 2108574000
tz.transition 2037, 3, :o3, 2121879600
tz.transition 2037, 10, :o2, 2140023600
tz.transition 2038, 3, :o3, 59172247, 24
tz.transition 2038, 10, :o2, 59177455, 24
tz.transition 2039, 3, :o3, 59180983, 24
tz.transition 2039, 10, :o2, 59186191, 24
tz.transition 2040, 3, :o3, 59189719, 24
tz.transition 2040, 10, :o2, 59194927, 24
tz.transition 2041, 3, :o3, 59198623, 24
tz.transition 2041, 10, :o2, 59203663, 24
tz.transition 2042, 3, :o3, 59207359, 24
tz.transition 2042, 10, :o2, 59212399, 24
tz.transition 2043, 3, :o3, 59216095, 24
tz.transition 2043, 10, :o2, 59221135, 24
tz.transition 2044, 3, :o3, 59224831, 24
tz.transition 2044, 10, :o2, 59230039, 24
tz.transition 2045, 3, :o3, 59233567, 24
tz.transition 2045, 10, :o2, 59238775, 24
tz.transition 2046, 3, :o3, 59242303, 24
tz.transition 2046, 10, :o2, 59247511, 24
tz.transition 2047, 3, :o3, 59251207, 24
tz.transition 2047, 10, :o2, 59256247, 24
tz.transition 2048, 3, :o3, 59259943, 24
tz.transition 2048, 10, :o2, 59264983, 24
tz.transition 2049, 3, :o3, 59268679, 24
tz.transition 2049, 10, :o2, 59273887, 24
tz.transition 2050, 3, :o3, 59277415, 24
tz.transition 2050, 10, :o2, 59282623, 24
end
end
end
end
end

View File

@@ -1,163 +0,0 @@
require 'tzinfo/timezone_definition'
module TZInfo
module Definitions
module Asia
module Magadan
include TimezoneDefinition
timezone 'Asia/Magadan' do |tz|
tz.offset :o0, 36192, 0, :LMT
tz.offset :o1, 36000, 0, :MAGT
tz.offset :o2, 39600, 0, :MAGT
tz.offset :o3, 39600, 3600, :MAGST
tz.offset :o4, 36000, 3600, :MAGST
tz.transition 1924, 5, :o1, 2181516373, 900
tz.transition 1930, 6, :o2, 29113777, 12
tz.transition 1981, 3, :o3, 354891600
tz.transition 1981, 9, :o2, 370699200
tz.transition 1982, 3, :o3, 386427600
tz.transition 1982, 9, :o2, 402235200
tz.transition 1983, 3, :o3, 417963600
tz.transition 1983, 9, :o2, 433771200
tz.transition 1984, 3, :o3, 449586000
tz.transition 1984, 9, :o2, 465318000
tz.transition 1985, 3, :o3, 481042800
tz.transition 1985, 9, :o2, 496767600
tz.transition 1986, 3, :o3, 512492400
tz.transition 1986, 9, :o2, 528217200
tz.transition 1987, 3, :o3, 543942000
tz.transition 1987, 9, :o2, 559666800
tz.transition 1988, 3, :o3, 575391600
tz.transition 1988, 9, :o2, 591116400
tz.transition 1989, 3, :o3, 606841200
tz.transition 1989, 9, :o2, 622566000
tz.transition 1990, 3, :o3, 638290800
tz.transition 1990, 9, :o2, 654620400
tz.transition 1991, 3, :o4, 670345200
tz.transition 1991, 9, :o1, 686073600
tz.transition 1992, 1, :o2, 695750400
tz.transition 1992, 3, :o3, 701784000
tz.transition 1992, 9, :o2, 717505200
tz.transition 1993, 3, :o3, 733244400
tz.transition 1993, 9, :o2, 748969200
tz.transition 1994, 3, :o3, 764694000
tz.transition 1994, 9, :o2, 780418800
tz.transition 1995, 3, :o3, 796143600
tz.transition 1995, 9, :o2, 811868400
tz.transition 1996, 3, :o3, 828198000
tz.transition 1996, 10, :o2, 846342000
tz.transition 1997, 3, :o3, 859647600
tz.transition 1997, 10, :o2, 877791600
tz.transition 1998, 3, :o3, 891097200
tz.transition 1998, 10, :o2, 909241200
tz.transition 1999, 3, :o3, 922546800
tz.transition 1999, 10, :o2, 941295600
tz.transition 2000, 3, :o3, 953996400
tz.transition 2000, 10, :o2, 972745200
tz.transition 2001, 3, :o3, 985446000
tz.transition 2001, 10, :o2, 1004194800
tz.transition 2002, 3, :o3, 1017500400
tz.transition 2002, 10, :o2, 1035644400
tz.transition 2003, 3, :o3, 1048950000
tz.transition 2003, 10, :o2, 1067094000
tz.transition 2004, 3, :o3, 1080399600
tz.transition 2004, 10, :o2, 1099148400
tz.transition 2005, 3, :o3, 1111849200
tz.transition 2005, 10, :o2, 1130598000
tz.transition 2006, 3, :o3, 1143298800
tz.transition 2006, 10, :o2, 1162047600
tz.transition 2007, 3, :o3, 1174748400
tz.transition 2007, 10, :o2, 1193497200
tz.transition 2008, 3, :o3, 1206802800
tz.transition 2008, 10, :o2, 1224946800
tz.transition 2009, 3, :o3, 1238252400
tz.transition 2009, 10, :o2, 1256396400
tz.transition 2010, 3, :o3, 1269702000
tz.transition 2010, 10, :o2, 1288450800
tz.transition 2011, 3, :o3, 1301151600
tz.transition 2011, 10, :o2, 1319900400
tz.transition 2012, 3, :o3, 1332601200
tz.transition 2012, 10, :o2, 1351350000
tz.transition 2013, 3, :o3, 1364655600
tz.transition 2013, 10, :o2, 1382799600
tz.transition 2014, 3, :o3, 1396105200
tz.transition 2014, 10, :o2, 1414249200
tz.transition 2015, 3, :o3, 1427554800
tz.transition 2015, 10, :o2, 1445698800
tz.transition 2016, 3, :o3, 1459004400
tz.transition 2016, 10, :o2, 1477753200
tz.transition 2017, 3, :o3, 1490454000
tz.transition 2017, 10, :o2, 1509202800
tz.transition 2018, 3, :o3, 1521903600
tz.transition 2018, 10, :o2, 1540652400
tz.transition 2019, 3, :o3, 1553958000
tz.transition 2019, 10, :o2, 1572102000
tz.transition 2020, 3, :o3, 1585407600
tz.transition 2020, 10, :o2, 1603551600
tz.transition 2021, 3, :o3, 1616857200
tz.transition 2021, 10, :o2, 1635606000
tz.transition 2022, 3, :o3, 1648306800
tz.transition 2022, 10, :o2, 1667055600
tz.transition 2023, 3, :o3, 1679756400
tz.transition 2023, 10, :o2, 1698505200
tz.transition 2024, 3, :o3, 1711810800
tz.transition 2024, 10, :o2, 1729954800
tz.transition 2025, 3, :o3, 1743260400
tz.transition 2025, 10, :o2, 1761404400
tz.transition 2026, 3, :o3, 1774710000
tz.transition 2026, 10, :o2, 1792854000
tz.transition 2027, 3, :o3, 1806159600
tz.transition 2027, 10, :o2, 1824908400
tz.transition 2028, 3, :o3, 1837609200
tz.transition 2028, 10, :o2, 1856358000
tz.transition 2029, 3, :o3, 1869058800
tz.transition 2029, 10, :o2, 1887807600
tz.transition 2030, 3, :o3, 1901113200
tz.transition 2030, 10, :o2, 1919257200
tz.transition 2031, 3, :o3, 1932562800
tz.transition 2031, 10, :o2, 1950706800
tz.transition 2032, 3, :o3, 1964012400
tz.transition 2032, 10, :o2, 1982761200
tz.transition 2033, 3, :o3, 1995462000
tz.transition 2033, 10, :o2, 2014210800
tz.transition 2034, 3, :o3, 2026911600
tz.transition 2034, 10, :o2, 2045660400
tz.transition 2035, 3, :o3, 2058361200
tz.transition 2035, 10, :o2, 2077110000
tz.transition 2036, 3, :o3, 2090415600
tz.transition 2036, 10, :o2, 2108559600
tz.transition 2037, 3, :o3, 2121865200
tz.transition 2037, 10, :o2, 2140009200
tz.transition 2038, 3, :o3, 19724081, 8
tz.transition 2038, 10, :o2, 19725817, 8
tz.transition 2039, 3, :o3, 19726993, 8
tz.transition 2039, 10, :o2, 19728729, 8
tz.transition 2040, 3, :o3, 19729905, 8
tz.transition 2040, 10, :o2, 19731641, 8
tz.transition 2041, 3, :o3, 19732873, 8
tz.transition 2041, 10, :o2, 19734553, 8
tz.transition 2042, 3, :o3, 19735785, 8
tz.transition 2042, 10, :o2, 19737465, 8
tz.transition 2043, 3, :o3, 19738697, 8
tz.transition 2043, 10, :o2, 19740377, 8
tz.transition 2044, 3, :o3, 19741609, 8
tz.transition 2044, 10, :o2, 19743345, 8
tz.transition 2045, 3, :o3, 19744521, 8
tz.transition 2045, 10, :o2, 19746257, 8
tz.transition 2046, 3, :o3, 19747433, 8
tz.transition 2046, 10, :o2, 19749169, 8
tz.transition 2047, 3, :o3, 19750401, 8
tz.transition 2047, 10, :o2, 19752081, 8
tz.transition 2048, 3, :o3, 19753313, 8
tz.transition 2048, 10, :o2, 19754993, 8
tz.transition 2049, 3, :o3, 19756225, 8
tz.transition 2049, 10, :o2, 19757961, 8
tz.transition 2050, 3, :o3, 19759137, 8
tz.transition 2050, 10, :o2, 19760873, 8
end
end
end
end
end

View File

@@ -1,164 +0,0 @@
require 'tzinfo/timezone_definition'
module TZInfo
module Definitions
module Asia
module Novosibirsk
include TimezoneDefinition
timezone 'Asia/Novosibirsk' do |tz|
tz.offset :o0, 19900, 0, :LMT
tz.offset :o1, 21600, 0, :NOVT
tz.offset :o2, 25200, 0, :NOVT
tz.offset :o3, 25200, 3600, :NOVST
tz.offset :o4, 21600, 3600, :NOVST
tz.transition 1919, 12, :o1, 2092872833, 864
tz.transition 1930, 6, :o2, 9704593, 4
tz.transition 1981, 3, :o3, 354906000
tz.transition 1981, 9, :o2, 370713600
tz.transition 1982, 3, :o3, 386442000
tz.transition 1982, 9, :o2, 402249600
tz.transition 1983, 3, :o3, 417978000
tz.transition 1983, 9, :o2, 433785600
tz.transition 1984, 3, :o3, 449600400
tz.transition 1984, 9, :o2, 465332400
tz.transition 1985, 3, :o3, 481057200
tz.transition 1985, 9, :o2, 496782000
tz.transition 1986, 3, :o3, 512506800
tz.transition 1986, 9, :o2, 528231600
tz.transition 1987, 3, :o3, 543956400
tz.transition 1987, 9, :o2, 559681200
tz.transition 1988, 3, :o3, 575406000
tz.transition 1988, 9, :o2, 591130800
tz.transition 1989, 3, :o3, 606855600
tz.transition 1989, 9, :o2, 622580400
tz.transition 1990, 3, :o3, 638305200
tz.transition 1990, 9, :o2, 654634800
tz.transition 1991, 3, :o4, 670359600
tz.transition 1991, 9, :o1, 686088000
tz.transition 1992, 1, :o2, 695764800
tz.transition 1992, 3, :o3, 701798400
tz.transition 1992, 9, :o2, 717519600
tz.transition 1993, 3, :o3, 733258800
tz.transition 1993, 5, :o4, 738086400
tz.transition 1993, 9, :o1, 748987200
tz.transition 1994, 3, :o4, 764712000
tz.transition 1994, 9, :o1, 780436800
tz.transition 1995, 3, :o4, 796161600
tz.transition 1995, 9, :o1, 811886400
tz.transition 1996, 3, :o4, 828216000
tz.transition 1996, 10, :o1, 846360000
tz.transition 1997, 3, :o4, 859665600
tz.transition 1997, 10, :o1, 877809600
tz.transition 1998, 3, :o4, 891115200
tz.transition 1998, 10, :o1, 909259200
tz.transition 1999, 3, :o4, 922564800
tz.transition 1999, 10, :o1, 941313600
tz.transition 2000, 3, :o4, 954014400
tz.transition 2000, 10, :o1, 972763200
tz.transition 2001, 3, :o4, 985464000
tz.transition 2001, 10, :o1, 1004212800
tz.transition 2002, 3, :o4, 1017518400
tz.transition 2002, 10, :o1, 1035662400
tz.transition 2003, 3, :o4, 1048968000
tz.transition 2003, 10, :o1, 1067112000
tz.transition 2004, 3, :o4, 1080417600
tz.transition 2004, 10, :o1, 1099166400
tz.transition 2005, 3, :o4, 1111867200
tz.transition 2005, 10, :o1, 1130616000
tz.transition 2006, 3, :o4, 1143316800
tz.transition 2006, 10, :o1, 1162065600
tz.transition 2007, 3, :o4, 1174766400
tz.transition 2007, 10, :o1, 1193515200
tz.transition 2008, 3, :o4, 1206820800
tz.transition 2008, 10, :o1, 1224964800
tz.transition 2009, 3, :o4, 1238270400
tz.transition 2009, 10, :o1, 1256414400
tz.transition 2010, 3, :o4, 1269720000
tz.transition 2010, 10, :o1, 1288468800
tz.transition 2011, 3, :o4, 1301169600
tz.transition 2011, 10, :o1, 1319918400
tz.transition 2012, 3, :o4, 1332619200
tz.transition 2012, 10, :o1, 1351368000
tz.transition 2013, 3, :o4, 1364673600
tz.transition 2013, 10, :o1, 1382817600
tz.transition 2014, 3, :o4, 1396123200
tz.transition 2014, 10, :o1, 1414267200
tz.transition 2015, 3, :o4, 1427572800
tz.transition 2015, 10, :o1, 1445716800
tz.transition 2016, 3, :o4, 1459022400
tz.transition 2016, 10, :o1, 1477771200
tz.transition 2017, 3, :o4, 1490472000
tz.transition 2017, 10, :o1, 1509220800
tz.transition 2018, 3, :o4, 1521921600
tz.transition 2018, 10, :o1, 1540670400
tz.transition 2019, 3, :o4, 1553976000
tz.transition 2019, 10, :o1, 1572120000
tz.transition 2020, 3, :o4, 1585425600
tz.transition 2020, 10, :o1, 1603569600
tz.transition 2021, 3, :o4, 1616875200
tz.transition 2021, 10, :o1, 1635624000
tz.transition 2022, 3, :o4, 1648324800
tz.transition 2022, 10, :o1, 1667073600
tz.transition 2023, 3, :o4, 1679774400
tz.transition 2023, 10, :o1, 1698523200
tz.transition 2024, 3, :o4, 1711828800
tz.transition 2024, 10, :o1, 1729972800
tz.transition 2025, 3, :o4, 1743278400
tz.transition 2025, 10, :o1, 1761422400
tz.transition 2026, 3, :o4, 1774728000
tz.transition 2026, 10, :o1, 1792872000
tz.transition 2027, 3, :o4, 1806177600
tz.transition 2027, 10, :o1, 1824926400
tz.transition 2028, 3, :o4, 1837627200
tz.transition 2028, 10, :o1, 1856376000
tz.transition 2029, 3, :o4, 1869076800
tz.transition 2029, 10, :o1, 1887825600
tz.transition 2030, 3, :o4, 1901131200
tz.transition 2030, 10, :o1, 1919275200
tz.transition 2031, 3, :o4, 1932580800
tz.transition 2031, 10, :o1, 1950724800
tz.transition 2032, 3, :o4, 1964030400
tz.transition 2032, 10, :o1, 1982779200
tz.transition 2033, 3, :o4, 1995480000
tz.transition 2033, 10, :o1, 2014228800
tz.transition 2034, 3, :o4, 2026929600
tz.transition 2034, 10, :o1, 2045678400
tz.transition 2035, 3, :o4, 2058379200
tz.transition 2035, 10, :o1, 2077128000
tz.transition 2036, 3, :o4, 2090433600
tz.transition 2036, 10, :o1, 2108577600
tz.transition 2037, 3, :o4, 2121883200
tz.transition 2037, 10, :o1, 2140027200
tz.transition 2038, 3, :o4, 7396531, 3
tz.transition 2038, 10, :o1, 7397182, 3
tz.transition 2039, 3, :o4, 7397623, 3
tz.transition 2039, 10, :o1, 7398274, 3
tz.transition 2040, 3, :o4, 7398715, 3
tz.transition 2040, 10, :o1, 7399366, 3
tz.transition 2041, 3, :o4, 7399828, 3
tz.transition 2041, 10, :o1, 7400458, 3
tz.transition 2042, 3, :o4, 7400920, 3
tz.transition 2042, 10, :o1, 7401550, 3
tz.transition 2043, 3, :o4, 7402012, 3
tz.transition 2043, 10, :o1, 7402642, 3
tz.transition 2044, 3, :o4, 7403104, 3
tz.transition 2044, 10, :o1, 7403755, 3
tz.transition 2045, 3, :o4, 7404196, 3
tz.transition 2045, 10, :o1, 7404847, 3
tz.transition 2046, 3, :o4, 7405288, 3
tz.transition 2046, 10, :o1, 7405939, 3
tz.transition 2047, 3, :o4, 7406401, 3
tz.transition 2047, 10, :o1, 7407031, 3
tz.transition 2048, 3, :o4, 7407493, 3
tz.transition 2048, 10, :o1, 7408123, 3
tz.transition 2049, 3, :o4, 7408585, 3
tz.transition 2049, 10, :o1, 7409236, 3
tz.transition 2050, 3, :o4, 7409677, 3
tz.transition 2050, 10, :o1, 7410328, 3
end
end
end
end
end

View File

@@ -1,164 +0,0 @@
require 'tzinfo/timezone_definition'
module TZInfo
module Definitions
module Asia
module Vladivostok
include TimezoneDefinition
timezone 'Asia/Vladivostok' do |tz|
tz.offset :o0, 31664, 0, :LMT
tz.offset :o1, 32400, 0, :VLAT
tz.offset :o2, 36000, 0, :VLAT
tz.offset :o3, 36000, 3600, :VLAST
tz.offset :o4, 32400, 3600, :VLASST
tz.offset :o5, 32400, 0, :VLAST
tz.transition 1922, 11, :o1, 13086214921, 5400
tz.transition 1930, 6, :o2, 19409185, 8
tz.transition 1981, 3, :o3, 354895200
tz.transition 1981, 9, :o2, 370702800
tz.transition 1982, 3, :o3, 386431200
tz.transition 1982, 9, :o2, 402238800
tz.transition 1983, 3, :o3, 417967200
tz.transition 1983, 9, :o2, 433774800
tz.transition 1984, 3, :o3, 449589600
tz.transition 1984, 9, :o2, 465321600
tz.transition 1985, 3, :o3, 481046400
tz.transition 1985, 9, :o2, 496771200
tz.transition 1986, 3, :o3, 512496000
tz.transition 1986, 9, :o2, 528220800
tz.transition 1987, 3, :o3, 543945600
tz.transition 1987, 9, :o2, 559670400
tz.transition 1988, 3, :o3, 575395200
tz.transition 1988, 9, :o2, 591120000
tz.transition 1989, 3, :o3, 606844800
tz.transition 1989, 9, :o2, 622569600
tz.transition 1990, 3, :o3, 638294400
tz.transition 1990, 9, :o2, 654624000
tz.transition 1991, 3, :o4, 670348800
tz.transition 1991, 9, :o5, 686077200
tz.transition 1992, 1, :o2, 695754000
tz.transition 1992, 3, :o3, 701787600
tz.transition 1992, 9, :o2, 717508800
tz.transition 1993, 3, :o3, 733248000
tz.transition 1993, 9, :o2, 748972800
tz.transition 1994, 3, :o3, 764697600
tz.transition 1994, 9, :o2, 780422400
tz.transition 1995, 3, :o3, 796147200
tz.transition 1995, 9, :o2, 811872000
tz.transition 1996, 3, :o3, 828201600
tz.transition 1996, 10, :o2, 846345600
tz.transition 1997, 3, :o3, 859651200
tz.transition 1997, 10, :o2, 877795200
tz.transition 1998, 3, :o3, 891100800
tz.transition 1998, 10, :o2, 909244800
tz.transition 1999, 3, :o3, 922550400
tz.transition 1999, 10, :o2, 941299200
tz.transition 2000, 3, :o3, 954000000
tz.transition 2000, 10, :o2, 972748800
tz.transition 2001, 3, :o3, 985449600
tz.transition 2001, 10, :o2, 1004198400
tz.transition 2002, 3, :o3, 1017504000
tz.transition 2002, 10, :o2, 1035648000
tz.transition 2003, 3, :o3, 1048953600
tz.transition 2003, 10, :o2, 1067097600
tz.transition 2004, 3, :o3, 1080403200
tz.transition 2004, 10, :o2, 1099152000
tz.transition 2005, 3, :o3, 1111852800
tz.transition 2005, 10, :o2, 1130601600
tz.transition 2006, 3, :o3, 1143302400
tz.transition 2006, 10, :o2, 1162051200
tz.transition 2007, 3, :o3, 1174752000
tz.transition 2007, 10, :o2, 1193500800
tz.transition 2008, 3, :o3, 1206806400
tz.transition 2008, 10, :o2, 1224950400
tz.transition 2009, 3, :o3, 1238256000
tz.transition 2009, 10, :o2, 1256400000
tz.transition 2010, 3, :o3, 1269705600
tz.transition 2010, 10, :o2, 1288454400
tz.transition 2011, 3, :o3, 1301155200
tz.transition 2011, 10, :o2, 1319904000
tz.transition 2012, 3, :o3, 1332604800
tz.transition 2012, 10, :o2, 1351353600
tz.transition 2013, 3, :o3, 1364659200
tz.transition 2013, 10, :o2, 1382803200
tz.transition 2014, 3, :o3, 1396108800
tz.transition 2014, 10, :o2, 1414252800
tz.transition 2015, 3, :o3, 1427558400
tz.transition 2015, 10, :o2, 1445702400
tz.transition 2016, 3, :o3, 1459008000
tz.transition 2016, 10, :o2, 1477756800
tz.transition 2017, 3, :o3, 1490457600
tz.transition 2017, 10, :o2, 1509206400
tz.transition 2018, 3, :o3, 1521907200
tz.transition 2018, 10, :o2, 1540656000
tz.transition 2019, 3, :o3, 1553961600
tz.transition 2019, 10, :o2, 1572105600
tz.transition 2020, 3, :o3, 1585411200
tz.transition 2020, 10, :o2, 1603555200
tz.transition 2021, 3, :o3, 1616860800
tz.transition 2021, 10, :o2, 1635609600
tz.transition 2022, 3, :o3, 1648310400
tz.transition 2022, 10, :o2, 1667059200
tz.transition 2023, 3, :o3, 1679760000
tz.transition 2023, 10, :o2, 1698508800
tz.transition 2024, 3, :o3, 1711814400
tz.transition 2024, 10, :o2, 1729958400
tz.transition 2025, 3, :o3, 1743264000
tz.transition 2025, 10, :o2, 1761408000
tz.transition 2026, 3, :o3, 1774713600
tz.transition 2026, 10, :o2, 1792857600
tz.transition 2027, 3, :o3, 1806163200
tz.transition 2027, 10, :o2, 1824912000
tz.transition 2028, 3, :o3, 1837612800
tz.transition 2028, 10, :o2, 1856361600
tz.transition 2029, 3, :o3, 1869062400
tz.transition 2029, 10, :o2, 1887811200
tz.transition 2030, 3, :o3, 1901116800
tz.transition 2030, 10, :o2, 1919260800
tz.transition 2031, 3, :o3, 1932566400
tz.transition 2031, 10, :o2, 1950710400
tz.transition 2032, 3, :o3, 1964016000
tz.transition 2032, 10, :o2, 1982764800
tz.transition 2033, 3, :o3, 1995465600
tz.transition 2033, 10, :o2, 2014214400
tz.transition 2034, 3, :o3, 2026915200
tz.transition 2034, 10, :o2, 2045664000
tz.transition 2035, 3, :o3, 2058364800
tz.transition 2035, 10, :o2, 2077113600
tz.transition 2036, 3, :o3, 2090419200
tz.transition 2036, 10, :o2, 2108563200
tz.transition 2037, 3, :o3, 2121868800
tz.transition 2037, 10, :o2, 2140012800
tz.transition 2038, 3, :o3, 14793061, 6
tz.transition 2038, 10, :o2, 14794363, 6
tz.transition 2039, 3, :o3, 14795245, 6
tz.transition 2039, 10, :o2, 14796547, 6
tz.transition 2040, 3, :o3, 14797429, 6
tz.transition 2040, 10, :o2, 14798731, 6
tz.transition 2041, 3, :o3, 14799655, 6
tz.transition 2041, 10, :o2, 14800915, 6
tz.transition 2042, 3, :o3, 14801839, 6
tz.transition 2042, 10, :o2, 14803099, 6
tz.transition 2043, 3, :o3, 14804023, 6
tz.transition 2043, 10, :o2, 14805283, 6
tz.transition 2044, 3, :o3, 14806207, 6
tz.transition 2044, 10, :o2, 14807509, 6
tz.transition 2045, 3, :o3, 14808391, 6
tz.transition 2045, 10, :o2, 14809693, 6
tz.transition 2046, 3, :o3, 14810575, 6
tz.transition 2046, 10, :o2, 14811877, 6
tz.transition 2047, 3, :o3, 14812801, 6
tz.transition 2047, 10, :o2, 14814061, 6
tz.transition 2048, 3, :o3, 14814985, 6
tz.transition 2048, 10, :o2, 14816245, 6
tz.transition 2049, 3, :o3, 14817169, 6
tz.transition 2049, 10, :o2, 14818471, 6
tz.transition 2050, 3, :o3, 14819353, 6
tz.transition 2050, 10, :o2, 14820655, 6
end
end
end
end
end

View File

@@ -1,163 +0,0 @@
require 'tzinfo/timezone_definition'
module TZInfo
module Definitions
module Asia
module Yakutsk
include TimezoneDefinition
timezone 'Asia/Yakutsk' do |tz|
tz.offset :o0, 31120, 0, :LMT
tz.offset :o1, 28800, 0, :YAKT
tz.offset :o2, 32400, 0, :YAKT
tz.offset :o3, 32400, 3600, :YAKST
tz.offset :o4, 28800, 3600, :YAKST
tz.transition 1919, 12, :o1, 2616091711, 1080
tz.transition 1930, 6, :o2, 14556889, 6
tz.transition 1981, 3, :o3, 354898800
tz.transition 1981, 9, :o2, 370706400
tz.transition 1982, 3, :o3, 386434800
tz.transition 1982, 9, :o2, 402242400
tz.transition 1983, 3, :o3, 417970800
tz.transition 1983, 9, :o2, 433778400
tz.transition 1984, 3, :o3, 449593200
tz.transition 1984, 9, :o2, 465325200
tz.transition 1985, 3, :o3, 481050000
tz.transition 1985, 9, :o2, 496774800
tz.transition 1986, 3, :o3, 512499600
tz.transition 1986, 9, :o2, 528224400
tz.transition 1987, 3, :o3, 543949200
tz.transition 1987, 9, :o2, 559674000
tz.transition 1988, 3, :o3, 575398800
tz.transition 1988, 9, :o2, 591123600
tz.transition 1989, 3, :o3, 606848400
tz.transition 1989, 9, :o2, 622573200
tz.transition 1990, 3, :o3, 638298000
tz.transition 1990, 9, :o2, 654627600
tz.transition 1991, 3, :o4, 670352400
tz.transition 1991, 9, :o1, 686080800
tz.transition 1992, 1, :o2, 695757600
tz.transition 1992, 3, :o3, 701791200
tz.transition 1992, 9, :o2, 717512400
tz.transition 1993, 3, :o3, 733251600
tz.transition 1993, 9, :o2, 748976400
tz.transition 1994, 3, :o3, 764701200
tz.transition 1994, 9, :o2, 780426000
tz.transition 1995, 3, :o3, 796150800
tz.transition 1995, 9, :o2, 811875600
tz.transition 1996, 3, :o3, 828205200
tz.transition 1996, 10, :o2, 846349200
tz.transition 1997, 3, :o3, 859654800
tz.transition 1997, 10, :o2, 877798800
tz.transition 1998, 3, :o3, 891104400
tz.transition 1998, 10, :o2, 909248400
tz.transition 1999, 3, :o3, 922554000
tz.transition 1999, 10, :o2, 941302800
tz.transition 2000, 3, :o3, 954003600
tz.transition 2000, 10, :o2, 972752400
tz.transition 2001, 3, :o3, 985453200
tz.transition 2001, 10, :o2, 1004202000
tz.transition 2002, 3, :o3, 1017507600
tz.transition 2002, 10, :o2, 1035651600
tz.transition 2003, 3, :o3, 1048957200
tz.transition 2003, 10, :o2, 1067101200
tz.transition 2004, 3, :o3, 1080406800
tz.transition 2004, 10, :o2, 1099155600
tz.transition 2005, 3, :o3, 1111856400
tz.transition 2005, 10, :o2, 1130605200
tz.transition 2006, 3, :o3, 1143306000
tz.transition 2006, 10, :o2, 1162054800
tz.transition 2007, 3, :o3, 1174755600
tz.transition 2007, 10, :o2, 1193504400
tz.transition 2008, 3, :o3, 1206810000
tz.transition 2008, 10, :o2, 1224954000
tz.transition 2009, 3, :o3, 1238259600
tz.transition 2009, 10, :o2, 1256403600
tz.transition 2010, 3, :o3, 1269709200
tz.transition 2010, 10, :o2, 1288458000
tz.transition 2011, 3, :o3, 1301158800
tz.transition 2011, 10, :o2, 1319907600
tz.transition 2012, 3, :o3, 1332608400
tz.transition 2012, 10, :o2, 1351357200
tz.transition 2013, 3, :o3, 1364662800
tz.transition 2013, 10, :o2, 1382806800
tz.transition 2014, 3, :o3, 1396112400
tz.transition 2014, 10, :o2, 1414256400
tz.transition 2015, 3, :o3, 1427562000
tz.transition 2015, 10, :o2, 1445706000
tz.transition 2016, 3, :o3, 1459011600
tz.transition 2016, 10, :o2, 1477760400
tz.transition 2017, 3, :o3, 1490461200
tz.transition 2017, 10, :o2, 1509210000
tz.transition 2018, 3, :o3, 1521910800
tz.transition 2018, 10, :o2, 1540659600
tz.transition 2019, 3, :o3, 1553965200
tz.transition 2019, 10, :o2, 1572109200
tz.transition 2020, 3, :o3, 1585414800
tz.transition 2020, 10, :o2, 1603558800
tz.transition 2021, 3, :o3, 1616864400
tz.transition 2021, 10, :o2, 1635613200
tz.transition 2022, 3, :o3, 1648314000
tz.transition 2022, 10, :o2, 1667062800
tz.transition 2023, 3, :o3, 1679763600
tz.transition 2023, 10, :o2, 1698512400
tz.transition 2024, 3, :o3, 1711818000
tz.transition 2024, 10, :o2, 1729962000
tz.transition 2025, 3, :o3, 1743267600
tz.transition 2025, 10, :o2, 1761411600
tz.transition 2026, 3, :o3, 1774717200
tz.transition 2026, 10, :o2, 1792861200
tz.transition 2027, 3, :o3, 1806166800
tz.transition 2027, 10, :o2, 1824915600
tz.transition 2028, 3, :o3, 1837616400
tz.transition 2028, 10, :o2, 1856365200
tz.transition 2029, 3, :o3, 1869066000
tz.transition 2029, 10, :o2, 1887814800
tz.transition 2030, 3, :o3, 1901120400
tz.transition 2030, 10, :o2, 1919264400
tz.transition 2031, 3, :o3, 1932570000
tz.transition 2031, 10, :o2, 1950714000
tz.transition 2032, 3, :o3, 1964019600
tz.transition 2032, 10, :o2, 1982768400
tz.transition 2033, 3, :o3, 1995469200
tz.transition 2033, 10, :o2, 2014218000
tz.transition 2034, 3, :o3, 2026918800
tz.transition 2034, 10, :o2, 2045667600
tz.transition 2035, 3, :o3, 2058368400
tz.transition 2035, 10, :o2, 2077117200
tz.transition 2036, 3, :o3, 2090422800
tz.transition 2036, 10, :o2, 2108566800
tz.transition 2037, 3, :o3, 2121872400
tz.transition 2037, 10, :o2, 2140016400
tz.transition 2038, 3, :o3, 59172245, 24
tz.transition 2038, 10, :o2, 59177453, 24
tz.transition 2039, 3, :o3, 59180981, 24
tz.transition 2039, 10, :o2, 59186189, 24
tz.transition 2040, 3, :o3, 59189717, 24
tz.transition 2040, 10, :o2, 59194925, 24
tz.transition 2041, 3, :o3, 59198621, 24
tz.transition 2041, 10, :o2, 59203661, 24
tz.transition 2042, 3, :o3, 59207357, 24
tz.transition 2042, 10, :o2, 59212397, 24
tz.transition 2043, 3, :o3, 59216093, 24
tz.transition 2043, 10, :o2, 59221133, 24
tz.transition 2044, 3, :o3, 59224829, 24
tz.transition 2044, 10, :o2, 59230037, 24
tz.transition 2045, 3, :o3, 59233565, 24
tz.transition 2045, 10, :o2, 59238773, 24
tz.transition 2046, 3, :o3, 59242301, 24
tz.transition 2046, 10, :o2, 59247509, 24
tz.transition 2047, 3, :o3, 59251205, 24
tz.transition 2047, 10, :o2, 59256245, 24
tz.transition 2048, 3, :o3, 59259941, 24
tz.transition 2048, 10, :o2, 59264981, 24
tz.transition 2049, 3, :o3, 59268677, 24
tz.transition 2049, 10, :o2, 59273885, 24
tz.transition 2050, 3, :o3, 59277413, 24
tz.transition 2050, 10, :o2, 59282621, 24
end
end
end
end
end

View File

@@ -1,165 +0,0 @@
require 'tzinfo/timezone_definition'
module TZInfo
module Definitions
module Asia
module Yekaterinburg
include TimezoneDefinition
timezone 'Asia/Yekaterinburg' do |tz|
tz.offset :o0, 14544, 0, :LMT
tz.offset :o1, 14400, 0, :SVET
tz.offset :o2, 18000, 0, :SVET
tz.offset :o3, 18000, 3600, :SVEST
tz.offset :o4, 14400, 3600, :SVEST
tz.offset :o5, 18000, 0, :YEKT
tz.offset :o6, 18000, 3600, :YEKST
tz.transition 1919, 7, :o1, 1453292699, 600
tz.transition 1930, 6, :o2, 7278445, 3
tz.transition 1981, 3, :o3, 354913200
tz.transition 1981, 9, :o2, 370720800
tz.transition 1982, 3, :o3, 386449200
tz.transition 1982, 9, :o2, 402256800
tz.transition 1983, 3, :o3, 417985200
tz.transition 1983, 9, :o2, 433792800
tz.transition 1984, 3, :o3, 449607600
tz.transition 1984, 9, :o2, 465339600
tz.transition 1985, 3, :o3, 481064400
tz.transition 1985, 9, :o2, 496789200
tz.transition 1986, 3, :o3, 512514000
tz.transition 1986, 9, :o2, 528238800
tz.transition 1987, 3, :o3, 543963600
tz.transition 1987, 9, :o2, 559688400
tz.transition 1988, 3, :o3, 575413200
tz.transition 1988, 9, :o2, 591138000
tz.transition 1989, 3, :o3, 606862800
tz.transition 1989, 9, :o2, 622587600
tz.transition 1990, 3, :o3, 638312400
tz.transition 1990, 9, :o2, 654642000
tz.transition 1991, 3, :o4, 670366800
tz.transition 1991, 9, :o1, 686095200
tz.transition 1992, 1, :o5, 695772000
tz.transition 1992, 3, :o6, 701805600
tz.transition 1992, 9, :o5, 717526800
tz.transition 1993, 3, :o6, 733266000
tz.transition 1993, 9, :o5, 748990800
tz.transition 1994, 3, :o6, 764715600
tz.transition 1994, 9, :o5, 780440400
tz.transition 1995, 3, :o6, 796165200
tz.transition 1995, 9, :o5, 811890000
tz.transition 1996, 3, :o6, 828219600
tz.transition 1996, 10, :o5, 846363600
tz.transition 1997, 3, :o6, 859669200
tz.transition 1997, 10, :o5, 877813200
tz.transition 1998, 3, :o6, 891118800
tz.transition 1998, 10, :o5, 909262800
tz.transition 1999, 3, :o6, 922568400
tz.transition 1999, 10, :o5, 941317200
tz.transition 2000, 3, :o6, 954018000
tz.transition 2000, 10, :o5, 972766800
tz.transition 2001, 3, :o6, 985467600
tz.transition 2001, 10, :o5, 1004216400
tz.transition 2002, 3, :o6, 1017522000
tz.transition 2002, 10, :o5, 1035666000
tz.transition 2003, 3, :o6, 1048971600
tz.transition 2003, 10, :o5, 1067115600
tz.transition 2004, 3, :o6, 1080421200
tz.transition 2004, 10, :o5, 1099170000
tz.transition 2005, 3, :o6, 1111870800
tz.transition 2005, 10, :o5, 1130619600
tz.transition 2006, 3, :o6, 1143320400
tz.transition 2006, 10, :o5, 1162069200
tz.transition 2007, 3, :o6, 1174770000
tz.transition 2007, 10, :o5, 1193518800
tz.transition 2008, 3, :o6, 1206824400
tz.transition 2008, 10, :o5, 1224968400
tz.transition 2009, 3, :o6, 1238274000
tz.transition 2009, 10, :o5, 1256418000
tz.transition 2010, 3, :o6, 1269723600
tz.transition 2010, 10, :o5, 1288472400
tz.transition 2011, 3, :o6, 1301173200
tz.transition 2011, 10, :o5, 1319922000
tz.transition 2012, 3, :o6, 1332622800
tz.transition 2012, 10, :o5, 1351371600
tz.transition 2013, 3, :o6, 1364677200
tz.transition 2013, 10, :o5, 1382821200
tz.transition 2014, 3, :o6, 1396126800
tz.transition 2014, 10, :o5, 1414270800
tz.transition 2015, 3, :o6, 1427576400
tz.transition 2015, 10, :o5, 1445720400
tz.transition 2016, 3, :o6, 1459026000
tz.transition 2016, 10, :o5, 1477774800
tz.transition 2017, 3, :o6, 1490475600
tz.transition 2017, 10, :o5, 1509224400
tz.transition 2018, 3, :o6, 1521925200
tz.transition 2018, 10, :o5, 1540674000
tz.transition 2019, 3, :o6, 1553979600
tz.transition 2019, 10, :o5, 1572123600
tz.transition 2020, 3, :o6, 1585429200
tz.transition 2020, 10, :o5, 1603573200
tz.transition 2021, 3, :o6, 1616878800
tz.transition 2021, 10, :o5, 1635627600
tz.transition 2022, 3, :o6, 1648328400
tz.transition 2022, 10, :o5, 1667077200
tz.transition 2023, 3, :o6, 1679778000
tz.transition 2023, 10, :o5, 1698526800
tz.transition 2024, 3, :o6, 1711832400
tz.transition 2024, 10, :o5, 1729976400
tz.transition 2025, 3, :o6, 1743282000
tz.transition 2025, 10, :o5, 1761426000
tz.transition 2026, 3, :o6, 1774731600
tz.transition 2026, 10, :o5, 1792875600
tz.transition 2027, 3, :o6, 1806181200
tz.transition 2027, 10, :o5, 1824930000
tz.transition 2028, 3, :o6, 1837630800
tz.transition 2028, 10, :o5, 1856379600
tz.transition 2029, 3, :o6, 1869080400
tz.transition 2029, 10, :o5, 1887829200
tz.transition 2030, 3, :o6, 1901134800
tz.transition 2030, 10, :o5, 1919278800
tz.transition 2031, 3, :o6, 1932584400
tz.transition 2031, 10, :o5, 1950728400
tz.transition 2032, 3, :o6, 1964034000
tz.transition 2032, 10, :o5, 1982782800
tz.transition 2033, 3, :o6, 1995483600
tz.transition 2033, 10, :o5, 2014232400
tz.transition 2034, 3, :o6, 2026933200
tz.transition 2034, 10, :o5, 2045682000
tz.transition 2035, 3, :o6, 2058382800
tz.transition 2035, 10, :o5, 2077131600
tz.transition 2036, 3, :o6, 2090437200
tz.transition 2036, 10, :o5, 2108581200
tz.transition 2037, 3, :o6, 2121886800
tz.transition 2037, 10, :o5, 2140030800
tz.transition 2038, 3, :o6, 19724083, 8
tz.transition 2038, 10, :o5, 19725819, 8
tz.transition 2039, 3, :o6, 19726995, 8
tz.transition 2039, 10, :o5, 19728731, 8
tz.transition 2040, 3, :o6, 19729907, 8
tz.transition 2040, 10, :o5, 19731643, 8
tz.transition 2041, 3, :o6, 19732875, 8
tz.transition 2041, 10, :o5, 19734555, 8
tz.transition 2042, 3, :o6, 19735787, 8
tz.transition 2042, 10, :o5, 19737467, 8
tz.transition 2043, 3, :o6, 19738699, 8
tz.transition 2043, 10, :o5, 19740379, 8
tz.transition 2044, 3, :o6, 19741611, 8
tz.transition 2044, 10, :o5, 19743347, 8
tz.transition 2045, 3, :o6, 19744523, 8
tz.transition 2045, 10, :o5, 19746259, 8
tz.transition 2046, 3, :o6, 19747435, 8
tz.transition 2046, 10, :o5, 19749171, 8
tz.transition 2047, 3, :o6, 19750403, 8
tz.transition 2047, 10, :o5, 19752083, 8
tz.transition 2048, 3, :o6, 19753315, 8
tz.transition 2048, 10, :o5, 19754995, 8
tz.transition 2049, 3, :o6, 19756227, 8
tz.transition 2049, 10, :o5, 19757963, 8
tz.transition 2050, 3, :o6, 19759139, 8
tz.transition 2050, 10, :o5, 19760875, 8
end
end
end
end
end

View File

@@ -1,165 +0,0 @@
require 'tzinfo/timezone_definition'
module TZInfo
module Definitions
module Asia
module Yerevan
include TimezoneDefinition
timezone 'Asia/Yerevan' do |tz|
tz.offset :o0, 10680, 0, :LMT
tz.offset :o1, 10800, 0, :YERT
tz.offset :o2, 14400, 0, :YERT
tz.offset :o3, 14400, 3600, :YERST
tz.offset :o4, 10800, 3600, :YERST
tz.offset :o5, 10800, 3600, :AMST
tz.offset :o6, 10800, 0, :AMT
tz.offset :o7, 14400, 0, :AMT
tz.offset :o8, 14400, 3600, :AMST
tz.transition 1924, 5, :o1, 1745213311, 720
tz.transition 1957, 2, :o2, 19487187, 8
tz.transition 1981, 3, :o3, 354916800
tz.transition 1981, 9, :o2, 370724400
tz.transition 1982, 3, :o3, 386452800
tz.transition 1982, 9, :o2, 402260400
tz.transition 1983, 3, :o3, 417988800
tz.transition 1983, 9, :o2, 433796400
tz.transition 1984, 3, :o3, 449611200
tz.transition 1984, 9, :o2, 465343200
tz.transition 1985, 3, :o3, 481068000
tz.transition 1985, 9, :o2, 496792800
tz.transition 1986, 3, :o3, 512517600
tz.transition 1986, 9, :o2, 528242400
tz.transition 1987, 3, :o3, 543967200
tz.transition 1987, 9, :o2, 559692000
tz.transition 1988, 3, :o3, 575416800
tz.transition 1988, 9, :o2, 591141600
tz.transition 1989, 3, :o3, 606866400
tz.transition 1989, 9, :o2, 622591200
tz.transition 1990, 3, :o3, 638316000
tz.transition 1990, 9, :o2, 654645600
tz.transition 1991, 3, :o4, 670370400
tz.transition 1991, 9, :o5, 685569600
tz.transition 1991, 9, :o6, 686098800
tz.transition 1992, 3, :o5, 701812800
tz.transition 1992, 9, :o6, 717534000
tz.transition 1993, 3, :o5, 733273200
tz.transition 1993, 9, :o6, 748998000
tz.transition 1994, 3, :o5, 764722800
tz.transition 1994, 9, :o6, 780447600
tz.transition 1995, 3, :o5, 796172400
tz.transition 1995, 9, :o7, 811897200
tz.transition 1997, 3, :o8, 859672800
tz.transition 1997, 10, :o7, 877816800
tz.transition 1998, 3, :o8, 891122400
tz.transition 1998, 10, :o7, 909266400
tz.transition 1999, 3, :o8, 922572000
tz.transition 1999, 10, :o7, 941320800
tz.transition 2000, 3, :o8, 954021600
tz.transition 2000, 10, :o7, 972770400
tz.transition 2001, 3, :o8, 985471200
tz.transition 2001, 10, :o7, 1004220000
tz.transition 2002, 3, :o8, 1017525600
tz.transition 2002, 10, :o7, 1035669600
tz.transition 2003, 3, :o8, 1048975200
tz.transition 2003, 10, :o7, 1067119200
tz.transition 2004, 3, :o8, 1080424800
tz.transition 2004, 10, :o7, 1099173600
tz.transition 2005, 3, :o8, 1111874400
tz.transition 2005, 10, :o7, 1130623200
tz.transition 2006, 3, :o8, 1143324000
tz.transition 2006, 10, :o7, 1162072800
tz.transition 2007, 3, :o8, 1174773600
tz.transition 2007, 10, :o7, 1193522400
tz.transition 2008, 3, :o8, 1206828000
tz.transition 2008, 10, :o7, 1224972000
tz.transition 2009, 3, :o8, 1238277600
tz.transition 2009, 10, :o7, 1256421600
tz.transition 2010, 3, :o8, 1269727200
tz.transition 2010, 10, :o7, 1288476000
tz.transition 2011, 3, :o8, 1301176800
tz.transition 2011, 10, :o7, 1319925600
tz.transition 2012, 3, :o8, 1332626400
tz.transition 2012, 10, :o7, 1351375200
tz.transition 2013, 3, :o8, 1364680800
tz.transition 2013, 10, :o7, 1382824800
tz.transition 2014, 3, :o8, 1396130400
tz.transition 2014, 10, :o7, 1414274400
tz.transition 2015, 3, :o8, 1427580000
tz.transition 2015, 10, :o7, 1445724000
tz.transition 2016, 3, :o8, 1459029600
tz.transition 2016, 10, :o7, 1477778400
tz.transition 2017, 3, :o8, 1490479200
tz.transition 2017, 10, :o7, 1509228000
tz.transition 2018, 3, :o8, 1521928800
tz.transition 2018, 10, :o7, 1540677600
tz.transition 2019, 3, :o8, 1553983200
tz.transition 2019, 10, :o7, 1572127200
tz.transition 2020, 3, :o8, 1585432800
tz.transition 2020, 10, :o7, 1603576800
tz.transition 2021, 3, :o8, 1616882400
tz.transition 2021, 10, :o7, 1635631200
tz.transition 2022, 3, :o8, 1648332000
tz.transition 2022, 10, :o7, 1667080800
tz.transition 2023, 3, :o8, 1679781600
tz.transition 2023, 10, :o7, 1698530400
tz.transition 2024, 3, :o8, 1711836000
tz.transition 2024, 10, :o7, 1729980000
tz.transition 2025, 3, :o8, 1743285600
tz.transition 2025, 10, :o7, 1761429600
tz.transition 2026, 3, :o8, 1774735200
tz.transition 2026, 10, :o7, 1792879200
tz.transition 2027, 3, :o8, 1806184800
tz.transition 2027, 10, :o7, 1824933600
tz.transition 2028, 3, :o8, 1837634400
tz.transition 2028, 10, :o7, 1856383200
tz.transition 2029, 3, :o8, 1869084000
tz.transition 2029, 10, :o7, 1887832800
tz.transition 2030, 3, :o8, 1901138400
tz.transition 2030, 10, :o7, 1919282400
tz.transition 2031, 3, :o8, 1932588000
tz.transition 2031, 10, :o7, 1950732000
tz.transition 2032, 3, :o8, 1964037600
tz.transition 2032, 10, :o7, 1982786400
tz.transition 2033, 3, :o8, 1995487200
tz.transition 2033, 10, :o7, 2014236000
tz.transition 2034, 3, :o8, 2026936800
tz.transition 2034, 10, :o7, 2045685600
tz.transition 2035, 3, :o8, 2058386400
tz.transition 2035, 10, :o7, 2077135200
tz.transition 2036, 3, :o8, 2090440800
tz.transition 2036, 10, :o7, 2108584800
tz.transition 2037, 3, :o8, 2121890400
tz.transition 2037, 10, :o7, 2140034400
tz.transition 2038, 3, :o8, 29586125, 12
tz.transition 2038, 10, :o7, 29588729, 12
tz.transition 2039, 3, :o8, 29590493, 12
tz.transition 2039, 10, :o7, 29593097, 12
tz.transition 2040, 3, :o8, 29594861, 12
tz.transition 2040, 10, :o7, 29597465, 12
tz.transition 2041, 3, :o8, 29599313, 12
tz.transition 2041, 10, :o7, 29601833, 12
tz.transition 2042, 3, :o8, 29603681, 12
tz.transition 2042, 10, :o7, 29606201, 12
tz.transition 2043, 3, :o8, 29608049, 12
tz.transition 2043, 10, :o7, 29610569, 12
tz.transition 2044, 3, :o8, 29612417, 12
tz.transition 2044, 10, :o7, 29615021, 12
tz.transition 2045, 3, :o8, 29616785, 12
tz.transition 2045, 10, :o7, 29619389, 12
tz.transition 2046, 3, :o8, 29621153, 12
tz.transition 2046, 10, :o7, 29623757, 12
tz.transition 2047, 3, :o8, 29625605, 12
tz.transition 2047, 10, :o7, 29628125, 12
tz.transition 2048, 3, :o8, 29629973, 12
tz.transition 2048, 10, :o7, 29632493, 12
tz.transition 2049, 3, :o8, 29634341, 12
tz.transition 2049, 10, :o7, 29636945, 12
tz.transition 2050, 3, :o8, 29638709, 12
tz.transition 2050, 10, :o7, 29641313, 12
end
end
end
end
end

View File

@@ -1,170 +0,0 @@
require 'tzinfo/timezone_definition'
module TZInfo
module Definitions
module Europe
module Minsk
include TimezoneDefinition
timezone 'Europe/Minsk' do |tz|
tz.offset :o0, 6616, 0, :LMT
tz.offset :o1, 6600, 0, :MMT
tz.offset :o2, 7200, 0, :EET
tz.offset :o3, 10800, 0, :MSK
tz.offset :o4, 3600, 3600, :CEST
tz.offset :o5, 3600, 0, :CET
tz.offset :o6, 10800, 3600, :MSD
tz.offset :o7, 7200, 3600, :EEST
tz.transition 1879, 12, :o1, 26003326573, 10800
tz.transition 1924, 5, :o2, 349042669, 144
tz.transition 1930, 6, :o3, 29113781, 12
tz.transition 1941, 6, :o4, 19441387, 8
tz.transition 1942, 11, :o5, 58335973, 24
tz.transition 1943, 3, :o4, 58339501, 24
tz.transition 1943, 10, :o5, 58344037, 24
tz.transition 1944, 4, :o4, 58348405, 24
tz.transition 1944, 7, :o3, 29175293, 12
tz.transition 1981, 3, :o6, 354920400
tz.transition 1981, 9, :o3, 370728000
tz.transition 1982, 3, :o6, 386456400
tz.transition 1982, 9, :o3, 402264000
tz.transition 1983, 3, :o6, 417992400
tz.transition 1983, 9, :o3, 433800000
tz.transition 1984, 3, :o6, 449614800
tz.transition 1984, 9, :o3, 465346800
tz.transition 1985, 3, :o6, 481071600
tz.transition 1985, 9, :o3, 496796400
tz.transition 1986, 3, :o6, 512521200
tz.transition 1986, 9, :o3, 528246000
tz.transition 1987, 3, :o6, 543970800
tz.transition 1987, 9, :o3, 559695600
tz.transition 1988, 3, :o6, 575420400
tz.transition 1988, 9, :o3, 591145200
tz.transition 1989, 3, :o6, 606870000
tz.transition 1989, 9, :o3, 622594800
tz.transition 1991, 3, :o7, 670374000
tz.transition 1991, 9, :o2, 686102400
tz.transition 1992, 3, :o7, 701820000
tz.transition 1992, 9, :o2, 717544800
tz.transition 1993, 3, :o7, 733276800
tz.transition 1993, 9, :o2, 749001600
tz.transition 1994, 3, :o7, 764726400
tz.transition 1994, 9, :o2, 780451200
tz.transition 1995, 3, :o7, 796176000
tz.transition 1995, 9, :o2, 811900800
tz.transition 1996, 3, :o7, 828230400
tz.transition 1996, 10, :o2, 846374400
tz.transition 1997, 3, :o7, 859680000
tz.transition 1997, 10, :o2, 877824000
tz.transition 1998, 3, :o7, 891129600
tz.transition 1998, 10, :o2, 909273600
tz.transition 1999, 3, :o7, 922579200
tz.transition 1999, 10, :o2, 941328000
tz.transition 2000, 3, :o7, 954028800
tz.transition 2000, 10, :o2, 972777600
tz.transition 2001, 3, :o7, 985478400
tz.transition 2001, 10, :o2, 1004227200
tz.transition 2002, 3, :o7, 1017532800
tz.transition 2002, 10, :o2, 1035676800
tz.transition 2003, 3, :o7, 1048982400
tz.transition 2003, 10, :o2, 1067126400
tz.transition 2004, 3, :o7, 1080432000
tz.transition 2004, 10, :o2, 1099180800
tz.transition 2005, 3, :o7, 1111881600
tz.transition 2005, 10, :o2, 1130630400
tz.transition 2006, 3, :o7, 1143331200
tz.transition 2006, 10, :o2, 1162080000
tz.transition 2007, 3, :o7, 1174780800
tz.transition 2007, 10, :o2, 1193529600
tz.transition 2008, 3, :o7, 1206835200
tz.transition 2008, 10, :o2, 1224979200
tz.transition 2009, 3, :o7, 1238284800
tz.transition 2009, 10, :o2, 1256428800
tz.transition 2010, 3, :o7, 1269734400
tz.transition 2010, 10, :o2, 1288483200
tz.transition 2011, 3, :o7, 1301184000
tz.transition 2011, 10, :o2, 1319932800
tz.transition 2012, 3, :o7, 1332633600
tz.transition 2012, 10, :o2, 1351382400
tz.transition 2013, 3, :o7, 1364688000
tz.transition 2013, 10, :o2, 1382832000
tz.transition 2014, 3, :o7, 1396137600
tz.transition 2014, 10, :o2, 1414281600
tz.transition 2015, 3, :o7, 1427587200
tz.transition 2015, 10, :o2, 1445731200
tz.transition 2016, 3, :o7, 1459036800
tz.transition 2016, 10, :o2, 1477785600
tz.transition 2017, 3, :o7, 1490486400
tz.transition 2017, 10, :o2, 1509235200
tz.transition 2018, 3, :o7, 1521936000
tz.transition 2018, 10, :o2, 1540684800
tz.transition 2019, 3, :o7, 1553990400
tz.transition 2019, 10, :o2, 1572134400
tz.transition 2020, 3, :o7, 1585440000
tz.transition 2020, 10, :o2, 1603584000
tz.transition 2021, 3, :o7, 1616889600
tz.transition 2021, 10, :o2, 1635638400
tz.transition 2022, 3, :o7, 1648339200
tz.transition 2022, 10, :o2, 1667088000
tz.transition 2023, 3, :o7, 1679788800
tz.transition 2023, 10, :o2, 1698537600
tz.transition 2024, 3, :o7, 1711843200
tz.transition 2024, 10, :o2, 1729987200
tz.transition 2025, 3, :o7, 1743292800
tz.transition 2025, 10, :o2, 1761436800
tz.transition 2026, 3, :o7, 1774742400
tz.transition 2026, 10, :o2, 1792886400
tz.transition 2027, 3, :o7, 1806192000
tz.transition 2027, 10, :o2, 1824940800
tz.transition 2028, 3, :o7, 1837641600
tz.transition 2028, 10, :o2, 1856390400
tz.transition 2029, 3, :o7, 1869091200
tz.transition 2029, 10, :o2, 1887840000
tz.transition 2030, 3, :o7, 1901145600
tz.transition 2030, 10, :o2, 1919289600
tz.transition 2031, 3, :o7, 1932595200
tz.transition 2031, 10, :o2, 1950739200
tz.transition 2032, 3, :o7, 1964044800
tz.transition 2032, 10, :o2, 1982793600
tz.transition 2033, 3, :o7, 1995494400
tz.transition 2033, 10, :o2, 2014243200
tz.transition 2034, 3, :o7, 2026944000
tz.transition 2034, 10, :o2, 2045692800
tz.transition 2035, 3, :o7, 2058393600
tz.transition 2035, 10, :o2, 2077142400
tz.transition 2036, 3, :o7, 2090448000
tz.transition 2036, 10, :o2, 2108592000
tz.transition 2037, 3, :o7, 2121897600
tz.transition 2037, 10, :o2, 2140041600
tz.transition 2038, 3, :o7, 4931021, 2
tz.transition 2038, 10, :o2, 4931455, 2
tz.transition 2039, 3, :o7, 4931749, 2
tz.transition 2039, 10, :o2, 4932183, 2
tz.transition 2040, 3, :o7, 4932477, 2
tz.transition 2040, 10, :o2, 4932911, 2
tz.transition 2041, 3, :o7, 4933219, 2
tz.transition 2041, 10, :o2, 4933639, 2
tz.transition 2042, 3, :o7, 4933947, 2
tz.transition 2042, 10, :o2, 4934367, 2
tz.transition 2043, 3, :o7, 4934675, 2
tz.transition 2043, 10, :o2, 4935095, 2
tz.transition 2044, 3, :o7, 4935403, 2
tz.transition 2044, 10, :o2, 4935837, 2
tz.transition 2045, 3, :o7, 4936131, 2
tz.transition 2045, 10, :o2, 4936565, 2
tz.transition 2046, 3, :o7, 4936859, 2
tz.transition 2046, 10, :o2, 4937293, 2
tz.transition 2047, 3, :o7, 4937601, 2
tz.transition 2047, 10, :o2, 4938021, 2
tz.transition 2048, 3, :o7, 4938329, 2
tz.transition 2048, 10, :o2, 4938749, 2
tz.transition 2049, 3, :o7, 4939057, 2
tz.transition 2049, 10, :o2, 4939491, 2
tz.transition 2050, 3, :o7, 4939785, 2
tz.transition 2050, 10, :o2, 4940219, 2
end
end
end
end
end

View File

@@ -1,23 +0,0 @@
require 'tzinfo/timezone_definition'
module TZInfo
module Definitions
module Pacific
module Fiji
include TimezoneDefinition
timezone 'Pacific/Fiji' do |tz|
tz.offset :o0, 42820, 0, :LMT
tz.offset :o1, 43200, 0, :FJT
tz.offset :o2, 43200, 3600, :FJST
tz.transition 1915, 10, :o1, 10457838739, 4320
tz.transition 1998, 10, :o2, 909842400
tz.transition 1999, 2, :o1, 920124000
tz.transition 1999, 11, :o2, 941896800
tz.transition 2000, 2, :o1, 951573600
end
end
end
end
end

View File

@@ -0,0 +1,8 @@
--no-private
--exclude ^lib/tzinfo/definitions/
--exclude ^lib/tzinfo/indexes/
lib/**/*.rb
-
CHANGES
LICENSE
README

View File

@@ -0,0 +1,505 @@
== Version 0.3.39 (tzdata v2014a) - 9-Mar-2014
* Updated to tzdata version 2014a
(http://mm.icann.org/pipermail/tz-announce/2014-March/000018.html).
== Version 0.3.38 (tzdata v2013g) - 8-Oct-2013
* Updated to tzdata version 2013g
(http://mm.icann.org/pipermail/tz-announce/2013-October/000015.html).
== Version 0.3.37 (tzdata v2013b) - 11-Mar-2013
* Updated to tzdata version 2013b
(http://mm.icann.org/pipermail/tz-announce/2013-March/000010.html).
== Version 0.3.36 (tzdata v2013a) - 3-Mar-2013
* Updated to tzdata version 2013a
(http://mm.icann.org/pipermail/tz-announce/2013-March/000009.html).
* Fix TimezoneTransitionInfo#eql? incorrectly returning false when running on
Ruby 2.0.
* Change eql? and == implementations to test the class of the passed in object
instead of checking individual properties with 'respond_to?'.
== Version 0.3.35 (tzdata v2012i) - 4-Nov-2012
* Updated to tzdata version 2012i
(http://mm.icann.org/pipermail/tz-announce/2012-November/000007.html).
== Version 0.3.34 (tzdata v2012h) - 27-Oct-2012
* Updated to tzdata version 2012h
(http://mm.icann.org/pipermail/tz-announce/2012-October/000006.html).
== Version 0.3.33 (tzdata v2012c) - 8-Apr-2012
* Updated to tzdata version 2012c
(http://article.gmane.org/gmane.comp.time.tz/4859).
== Version 0.3.32 (tzdata v2012b) - 4-Mar-2012
* Updated to tzdata version 2012b
(http://article.gmane.org/gmane.comp.time.tz/4756).
== Version 0.3.31 (tzdata v2011n) - 6-Nov-2011
* Updated to tzdata version 2011n
(http://article.gmane.org/gmane.comp.time.tz/4434).
== Version 0.3.30 (tzdata v2011k) - 29-Sep-2011
* Updated to tzdata version 2011k
(http://article.gmane.org/gmane.comp.time.tz/4084).
== Version 0.3.29 (tzdata v2011h) - 27-Jun-2011
* Updated to tzdata version 2011h
(http://article.gmane.org/gmane.comp.time.tz/3814).
* Allow the default value of the local_to_utc and period_for_local dst
parameter to be specified globally with a Timezone.default_dst attribute.
Thanks to Kurt Werle for the suggestion and patch.
== Version 0.3.28 (tzdata v2011g) - 13-Jun-2011
* Add support for Ruby 1.9.3 (trunk revision 31668 and later). Thanks to
Aaron Patterson for reporting the problems running on the new version.
Closes #29233.
== Version 0.3.27 (tzdata v2011g) - 26-Apr-2011
* Updated to tzdata version 2011g
(http://article.gmane.org/gmane.comp.time.tz/3758).
== Version 0.3.26 (tzdata v2011e) - 2-Apr-2011
* Updated to tzdata version 2011e
(http://article.gmane.org/gmane.comp.time.tz/3707).
== Version 0.3.25 (tzdata v2011d) - 14-Mar-2011
* Updated to tzdata version 2011d
(http://article.gmane.org/gmane.comp.time.tz/3662).
== Version 0.3.24 (tzdata v2010o) - 15-Jan-2011
* Updated to tzdata version 2010o
(http://article.gmane.org/gmane.comp.time.tz/3473).
== Version 0.3.23 (tzdata v2010l) - 19-Aug-2010
* Updated to tzdata version 2010l
(http://article.gmane.org/gmane.comp.time.tz/3354).
== Version 0.3.22 (tzdata v2010j) - 29-May-2010
* Corrected file permissions issue with 0.3.21 release.
== Version 0.3.21 (tzdata v2010j) - 28-May-2010
* Updated to tzdata version 2010j
(http://article.gmane.org/gmane.comp.time.tz/3225).
* Change invalid timezone check to exclude characters not used in timezone
identifiers and avoid 'character class has duplicated range' warnings with
Ruby 1.9.2.
* Ruby 1.9.2 has deprecated "require 'rational'", but older versions of
Ruby need rational to be required. Require rational only when the Rational
module has not already been loaded.
* Remove circular requires (now a warning in Ruby 1.9.2). Instead of using
requires in each file for dependencies, tzinfo.rb now requires all tzinfo
files. If you were previously requiring files within the tzinfo directory
(e.g. require 'tzinfo/timezone'), then you will now have to
require 'tzinfo' instead.
== Version 0.3.20 (tzdata v2010i) - 19-Apr-2010
* Updated to tzdata version 2010i
(http://article.gmane.org/gmane.comp.time.tz/3202).
== Version 0.3.19 (tzdata v2010h) - 5-Apr-2010
* Updated to tzdata version 2010h
(http://article.gmane.org/gmane.comp.time.tz/3188).
== Version 0.3.18 (tzdata v2010g) - 29-Mar-2010
* Updated to tzdata version 2010g
(http://article.gmane.org/gmane.comp.time.tz/3172).
== Version 0.3.17 (tzdata v2010e) - 8-Mar-2010
* Updated to tzdata version 2010e
(http://article.gmane.org/gmane.comp.time.tz/3128).
== Version 0.3.16 (tzdata v2009u) - 5-Jan-2010
* Support the use of '-' to denote '0' as an offset in the tz data files.
Used for the first time in the SAVE field in tzdata v2009u.
* Updated to tzdata version 2009u
(http://article.gmane.org/gmane.comp.time.tz/3053).
== Version 0.3.15 (tzdata v2009p) - 26-Oct-2009
* Updated to tzdata version 2009p
(http://article.gmane.org/gmane.comp.time.tz/2953).
* Added a description to the gem spec.
* List test files in test_files instead of files in the gem spec.
== Version 0.3.14 (tzdata v2009l) - 19-Aug-2009
* Updated to tzdata version 2009l
(http://article.gmane.org/gmane.comp.time.tz/2818).
* Include current directory in load path to allow running tests on
Ruby 1.9.2, which doesn't include it by default any more.
== Version 0.3.13 (tzdata v2009f) - 15-Apr-2009
* Updated to tzdata version 2009f
(http://article.gmane.org/gmane.comp.time.tz/2668).
* Untaint the timezone module filename after validation to allow use
with $SAFE == 1 (e.g. under mod_ruby). Thanks to Dmitry Borodaenko for
the suggestion. Closes #25349.
== Version 0.3.12 (tzdata v2008i) - 12-Nov-2008
* Updated to tzdata version 2008i
(http://article.gmane.org/gmane.comp.time.tz/2440).
== Version 0.3.11 (tzdata v2008g) - 7-Oct-2008
* Updated to tzdata version 2008g
(http://article.gmane.org/gmane.comp.time.tz/2335).
* Support Ruby 1.9.0-5. Rational.new! has now been removed in Ruby 1.9.
Only use Rational.new! if it is available (it is preferable in Ruby 1.8
for performance reasons). Thanks to Jeremy Kemper and Pratik Naik for
reporting this. Closes #22312.
* Apply a patch from Pratik Naik to replace assert calls that have been
deprecated in the Ruby svn trunk. Closes #22308.
== Version 0.3.10 (tzdata v2008f) - 16-Sep-2008
* Updated to tzdata version 2008f
(http://article.gmane.org/gmane.comp.time.tz/2293).
== Version 0.3.9 (tzdata v2008c) - 27-May-2008
* Updated to tzdata version 2008c
(http://article.gmane.org/gmane.comp.time.tz/2183).
* Support loading timezone data in the latest trunk versions of Ruby 1.9.
Rational.new! is now private, so call it using Rational.send :new! instead.
Thanks to Jeremy Kemper and Pratik Naik for spotting this. Closes #19184.
* Prevent warnings from being output when running Ruby with the -v or -w
command line options. Thanks to Paul McMahon for the patch. Closes #19719.
== Version 0.3.8 (tzdata v2008b) - 24-Mar-2008
* Updated to tzdata version 2008b
(http://article.gmane.org/gmane.comp.time.tz/2149).
* Support loading timezone data in Ruby 1.9.0. Use DateTime.new! if it is
available instead of DateTime.new0 when constructing transition times.
DateTime.new! was added in Ruby 1.8.6. DateTime.new0 was removed in
Ruby 1.9.0. Thanks to Joshua Peek for reporting this. Closes #17606.
* Modify some of the equality test cases to cope with the differences
between Ruby 1.8.6 and Ruby 1.9.0.
== Version 0.3.7 (tzdata v2008a) - 10-Mar-2008
* Updated to tzdata version 2008a
(http://article.gmane.org/gmane.comp.time.tz/2071).
== Version 0.3.6 (tzdata v2007k) - 1-Jan-2008
* Updated to tzdata version 2007k
(http://article.gmane.org/gmane.comp.time.tz/2029).
* Removed deprecated RubyGems autorequire option.
== Version 0.3.5 (tzdata v2007h) - 1-Oct-2007
* Updated to tzdata version 2007h
(http://article.gmane.org/gmane.comp.time.tz/1878).
== Version 0.3.4 (tzdata v2007g) - 21-Aug-2007
* Updated to tzdata version 2007g
(http://article.gmane.org/gmane.comp.time.tz/1810).
== Version 0.3.3 (tzdata v2006p) - 27-Nov-2006
* Updated to tzdata version 2006p
(http://article.gmane.org/gmane.comp.time.tz/1358).
== Version 0.3.2 (tzdata v2006n) - 11-Oct-2006
* Updated to tzdata version 2006n
(http://article.gmane.org/gmane.comp.time.tz/1288). Note that this release of
tzdata removes the country Serbia and Montenegro (CS) and replaces it with
separate Serbia (RS) and Montenegro (ME) entries.
== Version 0.3.1 (tzdata v2006j) - 21-Aug-2006
* Remove colon from case statements to avoid warning in Ruby 1.8.5. #5198.
* Use temporary variable to avoid dynamic string warning from rdoc.
* Updated to tzdata version 2006j
(http://article.gmane.org/gmane.comp.time.tz/1175).
== Version 0.3.0 (tzdata v2006g) - 17-Jul-2006
* New timezone data format. Timezone data now occupies less space on disk and
takes less memory once loaded. #4142, #4144.
* Timezone data is defined in modules rather than classes. Timezone instances
returned by Timezone.get are no longer instances of data classes, but are
instead instances of new DataTimezone and LinkedTimezone classes.
* Timezone instances can now be used with Marshal.dump and Marshal.load. #4240.
* Added a Timezone.get_proxy method that returns a TimezoneProxy object for a
given identifier.
* Country index data is now defined in a single module that is independent
of the Country class implementation.
* Country instances can now be used with Marshal.dump and Marshal.load. #4240.
* Country has a new zone_info method that returns CountryTimezone objects
containing additional information (latitude, longitude and a description)
relating to each Timezone. #4140.
* Timezones within a Country are now returned in an order that makes
geographic sense.
* The zdumptest utility now checks local to utc conversions in addition to
utc to local conversions.
* eql? method defined on Country and Timezone that is equivalent to ==.
* == method of Timezone no longer raises an exception when passed an object
with no identifier method.
* == method of Country no longer raises an exception when passed an object
with no code method.
* hash method defined on Country that returns the hash of the code.
* hash method defined on Timezone that returns the hash of the identifier.
* Miscellaneous API documentation corrections and improvements.
* Timezone definition and indexes are now excluded from rdoc (the contents were
previously ignored with #:nodoc: anyway).
* Removed no longer needed #:nodoc: directives from timezone data files (which
are now excluded from the rdoc build).
* Installation of the gem now causes rdoc API documentation to be generated.
#4905.
* When optimizing transitions to generate zone definitions, check the
UTC and standard offsets separately rather than just the total offset to UTC.
Fixes an incorrect abbreviation issue with Europe/London, Europe/Dublin and
Pacific/Auckland.
* Eliminated unnecessary .nil? calls to give a minor performance gain.
* Timezone.all and Timezone.all_identifiers now return all the
Timezones/identifiers rather than just those associated with countries. #4146.
* Added all_data_zones, all_data_zone_identifiers, all_linked_zones and
all_linked_zone_identifiers class methods to Timezone.
* Added a strftime method to Timezone that converts a time in UTC to local
time and then returns it formatted. %Z is replaced with the Timezone
abbreviation for the given time (for example, EST or EDT). #4143.
* Fix escaping of quotes in TZDataParser. This affected country names and
descriptions of timezones within countries.
== Version 0.2.2 (tzdata v2006g) - 17-May-2006
* Use class-scoped instance variables to store the Timezone identifier and
singleton instance. Loading a linked zone no longer causes the parent
zone's identifier to be changed. The instance method of a linked zone class
also now returns an instance of the linked zone class rather than the parent
class. #4502.
* The zdumptest utility now compares the TZInfo zone identifier with the zdump
zone identifier.
* The zdumptestall utility now exits if not supplied with enough parameters.
* Updated to tzdata version 2006g
(http://article.gmane.org/gmane.comp.time.tz/1008).
== Version 0.2.1 (tzdata v2006d) - 17-Apr-2006
* Fix a performance issue caused in 0.2.0 with Timezone.local_to_utc.
Conversions performed on TimeOrDateTime instances passed to <=> are now
cached as originally intended. Thanks to Michael Smedberg for spotting this.
* Fix a performance issue with the local_to_utc period search algorithm
originally implemented in 0.1.0. The condition that was supposed to cause
the search to terminate when enough periods had been found was only being
evaluated in a small subset of cases. Thanks to Michael Smedberg and
Jamis Buck for reporting this.
* Added abbreviation as an alias for TimezonePeriod.zone_identifier.
* Updated to tzdata version 2006d
(http://article.gmane.org/gmane.comp.time.tz/936).
* Ignore any offset in DateTimes passed in (as is already done for Times).
All of the following now refer to the same UTC time (15:40 on 17 April 2006).
Previously, the DateTime in the second line would have been interpreted
as 20:40.
tz.utc_to_local(DateTime.new(2006, 4, 17, 15, 40, 0))
tz.utc_to_local(DateTime.new(2006, 4, 17, 15, 40, 0).new_offset(Rational(5, 24)))
tz.utc_to_local(Time.utc(2006, 4, 17, 15, 40, 0))
tz.utc_to_local(Time.local(2006, 4, 17, 15, 40, 0))
== Version 0.2.0 (tzdata v2006c) - 3-Apr-2006
* Use timestamps rather than DateTime objects in zone files for times between
1970 and 2037 (the range of Time).
* Don't convert passed in Time objects to DateTime in most cases (provides
a substantial performance improvement).
* Allow integer timestamps (time in seconds since 1970-1-1) to be used as well
as Time and DateTime objects in all public methods that take times as
parameters.
* Tool to compare TZInfo conversions with output from zdump.
* TZDataParser zone generation algorithm rewritten. Now based on the zic code.
TZInfo is now 100% compatible with zic/zdump output.
* Riyadh Solar Time zones now included again (generation time has been reduced
with TZDataParser changes).
* Use binary mode when writing zone and country files to get Unix (\n) new
lines.
* Omit unnecessary quotes in zone identifier symbols.
* Omit the final transition to DST if there is a prior transition in the last
year processed to standard time.
* Updated to tzdata version 2006c
(http://article.gmane.org/gmane.comp.time.tz/920).
== Version 0.1.2 (tzdata v2006a) - 5-Feb-2006
* Add lib directory to the load path when tzinfo is required. Makes it easier
to use tzinfo gem when unpacked to vendor directory in rails.
* Updated to tzdata version 2006a
(http://article.gmane.org/gmane.comp.time.tz/738).
* build_tz_classes rake task now handles running svn add and svn delete as new
timezones and countries are added and old ones are removed.
* Return a better error when attempting to use a Timezone instance that was
constructed with Timezone.new(nil). This will occur when using Rails'
composed_of. When the timezone identifier in the database is null, attempting
to use the Timezone will now result in an UnknownTimezone exception rather
than a NameError.
== Version 0.1.1 (tzdata v2005q) - 18-Dec-2005
* Timezones that are defined by a single unbounded period (e.g. UTC) now
work again.
* Updated to tzdata version 2005q.
== Version 0.1.0 (tzdata v2005n) - 27-Nov-2005
* period_for_local and local_to_utc now allow resolution of ambiguous
times (e.g. when switching from daylight savings to standard time).
The behaviour of these methods when faced with an ambiguous local time
has now changed. If you are using these methods you should check
the documentation. Thanks to Cliff Matthews for suggesting this change.
* Added require 'date' to timezone.rb (date isn't loaded by default in all
environments).
* Use rake to build packages and documentation.
* License file is now included in gem distribution.
* Dates in definitions stored as Astronomical Julian Day numbers rather than
as civil dates (improves performance creating DateTime instances).
* Added options to TZDataParser to allow generation of specific zones and
countries.
* Moved TimezonePeriod class to timezone_period.rb.
* New TimezonePeriodList class to store TimezonePeriods for a timezone and
perform searches for periods.
* Timezones now defined using blocks. TimezonePeriods are only instantiated
when they are needed. Thanks to Jamis Buck for the suggestion.
* Add options to TZDataParser to allow exclusion of specific zones and
countries.
* Exclude the Riyadh Solar Time zones. The rules are only for 1987 to 1989 and
take a long time to generate and process. Riyadh Solar Time is no longer
observed.
* The last TimezonePeriod for each Timezone is now written out with an
unbounded rather than arbitrary end time.
* Construct the Rational offset in TimezonePeriod once when the TimezonePeriod
is constructed rather than each time it is needed.
* Timezone and Country now keep a cache of loaded instances to avoid running
require which can be slow on some platforms.
* Updated to tzdata version 2005n.
== Version 0.0.4 (tzdata v2005m) - 18-Sep-2005
* Removed debug output accidentally included in the previous release.
* Fixed a bug in the generation of friendly zone identifiers (was inserting
apostrophes into UTC, GMT, etc).
* Fixed Country <=> operator (was comparing non-existent attribute)
* Fixed Timezone.period_for_local error when period not found.
* Added testcases for Timezone, TimezoneProxy, TimezonePeriod, Country and
some selected timezones.
== Version 0.0.3 (tzdata v2005m) - 17-Sep-2005
* Reduced visibility of some methods added in Timezone#setup and Country#setup.
* Added name method to Timezone (returns the identifier).
* Added friendly_identifier method to Timezone. Returns a more friendly version
of the identifier.
* Added to_s method to Timezone. Returns the friendly identifier.
* Added == and <=> operators to Timezone (compares identifiers).
* Timezone now includes Comparable.
* Added to_s method to Country.
* Added == and <=> operators to Country (compares ISO 3166 country codes).
* Country now includes Comparable.
* New TimezoneProxy class that behaves the same as a Timezone but doesn't
actually load in its definition until it is actually required.
* Modified Timezone and Country methods that return Timezones to return
TimezoneProxy instances instead. This makes these methods much quicker.
In Ruby on Rails, you can now show a drop-down list of all timezones using the
Rails time_zone_select helper method:
<%= time_zone_select 'user', 'time_zone', TZInfo::Timezone.all.sort, :model => TZInfo::Timezone %>
== Version 0.0.2 (tzdata v2005m) - 13-Sep-2005
* Country and Timezone data is now loaded into class rather than instance
variables. This makes Timezone links more efficient and saves memory if
creating specific Timezone and Country classes directly.
* TimezonePeriod zone_identifier is now defined as a symbol to save memory
(was previously a string).
* TimezonePeriod zone_identifiers that were previously '' are now :Unknown.
* Timezones and Countries can now be returned using Timezone.new(identifier)
and Country.new(identifier). When passed an identifier, the new method
calls get to return an instance of the specified timezone or country.
* Added new class methods to Timezone to return sets of zones and identifiers.
Thanks to Scott Barron of Lunchbox Software for the suggestions in his
article about using TZInfo with Rails
(http://lunchroom.lunchboxsoftware.com/pages/tzinfo_rails)
== Version 0.0.1 (tzdata v2005m) - 29-Aug-2005
* First release.

View File

@@ -0,0 +1,19 @@
Copyright (c) 2005-2006 Philip Ross
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@@ -0,0 +1,98 @@
= TZInfo -- Daylight-savings aware timezone support for Ruby
TZInfo[http://tzinfo.github.io] uses the IANA Time Zone Database
(http://www.iana.org/time-zones) to provide
daylight-savings aware transformations between times in different timezones.
This is the same database as used for zoneinfo on Unix machines.
The Time Zone database has been imported (using TZDataParser) and turned into a
set of Ruby modules (which are packaged with this release).
== Example usage
To convert a time in UTC to a local time in the America/New_York timezone, you
can do the following:
require 'tzinfo'
tz = TZInfo::Timezone.get('America/New_York')
local = tz.utc_to_local(Time.utc(2005,8,29,15,35,0))
Note that the Time returned will look like it is UTC (Time.zone will return
"UTC"). This is because it is not currently possible to change the offset of
an individual Time instance.
To convert from a local time to UTC, the local_to_utc method can be used.
utc = tz.local_to_utc(local)
Note that the timezone information of the time you pass in is ignored. The
following two lines will return the same result regardless of the local
timezone:
tz.local_to_utc(Time.local(2006,6,26,1,0,0))
tz.local_to_utc(Time.utc(2006,6,26,1,0,0))
To get information about the rules in force at a particular UTC or local time,
the Timezone.period_for_utc and Timezone.period_for_local methods can be used.
Both of these methods return TimezonePeriod objects. The following gets the
identifier for the period (in this case EDT).
period = tz.period_for_utc(DateTime.new(2005,8,29,15,35,0))
id = period.zone_identifier
In all the above examples, instances of Time can be used instead of DateTime.
Timezone#utc_to_local and Timezone#local_to_utc both return the type they are
passed.
You can get the current local time in a Timezone with the Timezone#now method:
now = tz.now
All methods in TZInfo that take a time can be used with either Time, DateTime
or Integers (Time#to_i). The return type will be the same as the type passed in.
You can also access Timezones by Country (ISO 3166 country code). The following
gets all the Timezone identifiers for the US:
us = TZInfo::Country.get('US')
timezones = us.zone_identifiers
The zone_info method of Country provides an additional description and
location for each Timezone in the Country.
The above covers the most common uses of Timezone and Country. For more detail,
see the API documentation for the individual classes.
== Documentation
API documentation for TZInfo is available on RubyDoc.info[http://rubydoc.info/gems/tzinfo/frames].
== Installation
The preferred method of installing TZInfo is through the GEM file (RubyGems[http://docs.rubygems.org/] required):
% gem install tzinfo-x.y.z.gem
or to automatically download and install:
% gem install tzinfo --remote
== License
TZInfo is released under the MIT[http://opensource.org/licenses/mit-license.html] license.
== Source Code
Source code for TZInfo is available on GitHub[https://github.com/tzinfo/tzinfo].
== Issue Tracker
Please post any bugs, issues, feature requests or questions to the
{GitHub issue tracker}[https://github.com/tzinfo/tzinfo/issues].

View File

@@ -0,0 +1,282 @@
# Available options:
#
# rake test - Runs all test cases.
# rake package - Runs test cases and builds packages for distribution.
# rake rdoc - Builds API documentation in doc dir.
# rake build_tz_modules - Builds Timezone modules and the Country index.
# Expects to find source data in ../data.
# rake build_tz_module zone=Zone/Name - Builds a single Timezone module.
# Expects to find source data in ../data.
# rake build_countries - Builds the Country index.
# Expects to find source data in ../data.
require 'rake'
require 'rake/testtask'
require 'rake/rdoctask'
require 'rake/gempackagetask'
require 'fileutils'
Rake::TaskManager.class_eval do
def remove_task(task_name)
@tasks.delete(task_name.to_s)
end
end
def remove_task(task_name)
Rake.application.remove_task(task_name)
end
self.class.class_eval { alias_method :orig_sh, :sh }
private :orig_sh
def sh(*cmd, &block)
if cmd.first =~ /\A__tar_with_owner__ -?([zjcvf]+)(.*)\z/
opts = $1
args = $2
cmd[0] = "tar c --owner 0 --group 0 -#{opts.gsub('c', '')}#{args}"
end
orig_sh(*cmd, &block)
end
BUILD_TZ_CLASSES_DIR = 'lib/tzinfo.build_tz_classes'
SPEC = eval(File.read('tzinfo.gemspec'))
package_task = Rake::GemPackageTask.new(SPEC) do |pkg|
pkg.need_zip = true
pkg.need_tar_gz = true
pkg.tar_command = '__tar_with_owner__'
end
# Replace the Rake::PackageTask task that prepares the files to package with
# a version that ensures the permissions are correct for the package.
# Also just copy rather than link the files so that old versions are maintained.
remove_task package_task.package_dir_path
file package_task.package_dir_path => [package_task.package_dir] + package_task.package_files do
mkdir_p package_task.package_dir_path rescue nil
chmod(0755, package_task.package_dir_path)
package_task.package_files.each do |fn|
f = File.join(package_task.package_dir_path, fn)
fdir = File.dirname(f)
mkdir_p(fdir) if !File.exist?(fdir)
if File.directory?(fn)
mkdir_p(f)
chmod(0755, f)
else
rm_f f
cp(fn, f)
chmod(0644, f)
end
end
end
# Replace the Rake::GemPackageTask task that builds the gem with a version that
# changes to the copied package directory first. This allows the gem builder
# to pick up the correct file permissions.
remove_task "#{package_task.package_dir}/#{package_task.gem_file}"
file "#{package_task.package_dir}/#{package_task.gem_file}" => [package_task.package_dir] + package_task.gem_spec.files do
when_writing("Creating GEM") do
chdir(package_task.package_dir_path) do
Gem::Builder.new(package_task.gem_spec).build
end
verbose(true) do
mv File.join(package_task.package_dir_path, package_task.gem_file), "#{package_task.package_dir}/#{package_task.gem_file}"
end
end
end
Rake::TestTask.new('test') do |t|
# Force a particular timezone to be local (helps find issues when local
# timezone isn't GMT). This won't work on Windows.
ENV['TZ'] = 'America/Los_Angeles'
t.libs << '.'
t.pattern = 'test/tc_*.rb'
t.verbose = true
end
Rake::RDocTask.new do |rdoc|
rdoc.rdoc_dir = 'doc'
rdoc.title = "TZInfo"
rdoc.options << '--inline-source'
rdoc.options.concat SPEC.rdoc_options
rdoc.rdoc_files.include(*SPEC.extra_rdoc_files)
rdoc.rdoc_files.include('lib')
end
task :build_tz_modules do
require 'lib/tzinfo/tzdataparser'
FileUtils.mkdir_p(BUILD_TZ_CLASSES_DIR)
begin
p = TZInfo::TZDataParser.new('data', BUILD_TZ_CLASSES_DIR)
p.execute
scm = Scm.create(File.dirname(__FILE__))
['indexes', 'definitions'].each do |dir|
scm.sync("#{BUILD_TZ_CLASSES_DIR}/#{dir}", "lib/tzinfo/#{dir}")
end
ensure
FileUtils.rm_rf(BUILD_TZ_CLASSES_DIR)
end
end
class Scm
def self.create(dir)
if File.directory?(File.join(dir, '.git'))
GitScm.new(dir)
elsif File.directory?(File.join(dir, '.svn'))
SvnScm.new(dir)
else
NullScm.new(dir)
end
end
def initialize(dir)
end
def sync(source_dir, target_dir)
puts "Sync from #{source_dir} to #{target_dir}#{command ? " using #{command}" : ''}"
sync_dirs(source_dir, target_dir)
end
protected
def exec_scm(params)
puts "#{command} #{params}"
`#{command} #{params}`
raise "#{command} exited with status #$?" if $? != 0
end
private
def sync_dirs(source_dir, target_dir)
# Assumes a directory will never turn into a file and vice-versa
# (files will all end in .rb, directories won't).
source_entries, target_entries = [source_dir, target_dir].collect do |dir|
Dir.entries(dir).delete_if {|entry| entry =~ /\A\./}.sort
end
until source_entries.empty? || target_entries.empty?
last_source = source_entries.last
last_target = target_entries.last
if last_source == last_target
source_file = File.join(source_dir, last_source)
target_file = File.join(target_dir, last_target)
if File.directory?(source_file)
sync_dirs(source_file, target_file)
else
FileUtils.cp(source_file, target_file)
end
source_entries.pop
target_entries.pop
elsif source_entries.last < target_entries.last
sync_only_in_target(target_dir, target_entries)
else
sync_only_in_source(source_dir, target_dir, source_entries)
end
end
until target_entries.empty?
sync_only_in_target(target_dir, target_entries)
end
until source_entries.empty?
sync_only_in_source(source_dir, target_dir, source_entries)
end
end
def sync_only_in_target(target_dir, target_entries)
target_file = File.join(target_dir, target_entries.last)
delete(target_file)
target_entries.pop
end
def sync_only_in_source(source_dir, target_dir, source_entries)
source_file = File.join(source_dir, source_entries.last)
target_file = File.join(target_dir, source_entries.last)
if File.directory?(source_file)
Dir.mkdir(target_file)
add(target_file)
sync_dirs(source_file, target_file)
else
FileUtils.cp(source_file, target_file)
add(target_file)
end
source_entries.pop
end
end
class NullScm < Scm
def command
nil
end
def add(file)
end
def delete(file)
puts "rm -rf \"#{file}\""
FileUtils.rm_rf(file)
end
end
class GitScm < Scm
def command
'git'
end
def add(file)
unless File.directory?(file)
exec_scm "add \"#{file}\""
end
end
def delete(file)
exec_scm "rm -rf \"#{file}\""
end
end
class SvnScm < Scm
def command
'svn'
end
def add(file)
exec_scm "add \"#{file}\""
end
def delete(file)
exec_scm "delete --force \"#{file}\""
end
end
task :build_tz_module do
require 'lib/tzinfo/tzdataparser'
p = TZInfo::TZDataParser.new('data', 'lib/tzinfo')
p.generate_countries = false
p.only_zones = [ENV['zone']]
p.execute
end
task :build_countries do
require 'lib/tzinfo/tzdataparser'
p = TZInfo::TZDataParser.new('data', 'lib/tzinfo')
p.generate_countries = true
p.generate_zones = false
p.execute
end

View File

@@ -1,13 +1,13 @@
#--
# Copyright (c) 2005-2006 Philip Ross
#
# Copyright (c) 2005-2010 Philip Ross
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
@@ -25,10 +25,31 @@
$:.unshift(File.dirname(__FILE__)) unless
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
require 'tzinfo/ruby_core_support'
require 'tzinfo/offset_rationals'
require 'tzinfo/time_or_datetime'
require 'tzinfo/timezone_definition'
require 'tzinfo/timezone_offset_info'
require 'tzinfo/timezone_transition_info'
require 'tzinfo/timezone_index_definition'
require 'tzinfo/timezone_info'
require 'tzinfo/data_timezone_info'
require 'tzinfo/linked_timezone_info'
require 'tzinfo/timezone_period'
require 'tzinfo/timezone'
# require 'tzinfo/country'
# require 'tzinfo/tzdataparser'
# require 'tzinfo/timezone_proxy'
require 'tzinfo/info_timezone'
require 'tzinfo/data_timezone'
require 'tzinfo/linked_timezone'
require 'tzinfo/definitions'
require 'tzinfo/timezone_proxy'
require 'tzinfo/country_index_definition'
require 'tzinfo/country_info'
require 'tzinfo/country'
require 'tzinfo/country_timezone'

View File

@@ -0,0 +1,180 @@
#--
# Copyright (c) 2005-2013 Philip Ross
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#++
module TZInfo
# Thrown by Country#get if the code given is not valid.
class InvalidCountryCode < StandardError
end
# An ISO 3166 country. Can be used to get a list of Timezones for a country.
# For example:
#
# us = Country.get('US')
# us.zone_identifiers
# us.zones
# us.zone_info
class Country
include Comparable
# Defined countries.
#
# @!visibility private
@@countries = {}
# Whether the countries index has been loaded yet.
#
# @!visibility private
@@index_loaded = false
# Gets a Country by its ISO 3166 code. Raises an InvalidCountryCode
# exception if it couldn't be found.
def self.get(identifier)
instance = @@countries[identifier]
unless instance
load_index
info = Indexes::Countries.countries[identifier]
raise InvalidCountryCode.new, 'Invalid identifier' unless info
instance = Country.new(info)
@@countries[identifier] = instance
end
instance
end
# If identifier is a CountryInfo object, initializes the Country instance,
# otherwise calls get(identifier).
def self.new(identifier)
if identifier.kind_of?(CountryInfo)
instance = super()
instance.send :setup, identifier
instance
else
get(identifier)
end
end
# Returns an Array of all the valid country codes.
def self.all_codes
load_index
Indexes::Countries.countries.keys
end
# Returns an Array of all the defined Countries.
def self.all
load_index
Indexes::Countries.countries.keys.collect {|code| get(code)}
end
# The ISO 3166 country code.
def code
@info.code
end
# The name of the country.
def name
@info.name
end
# Alias for name.
def to_s
name
end
# Returns internal object state as a programmer-readable string.
def inspect
"#<#{self.class}: #{@info.code}>"
end
# Returns a frozen array of all the zone identifiers for the country. These
# are in an order that
# (1) makes some geographical sense, and
# (2) puts the most populous zones first, where that does not contradict (1).
def zone_identifiers
@info.zone_identifiers
end
alias zone_names zone_identifiers
# An array of all the Timezones for this country. Returns TimezoneProxy
# objects to avoid the overhead of loading Timezone definitions until
# a conversion is actually required. The Timezones are returned in an order
# that
# (1) makes some geographical sense, and
# (2) puts the most populous zones first, where that does not contradict (1).
def zones
zone_identifiers.collect {|id|
Timezone.get_proxy(id)
}
end
# Returns a frozen array of all the timezones for the for the country as
# CountryTimezone instances (containing extra information about each zone).
# These are in an order that
# (1) makes some geographical sense, and
# (2) puts the most populous zones first, where that does not contradict (1).
def zone_info
@info.zones
end
# Compare two Countries based on their code. Returns -1 if c is less
# than self, 0 if c is equal to self and +1 if c is greater than self.
def <=>(c)
code <=> c.code
end
# Returns true if and only if the code of c is equal to the code of this
# Country.
def eql?(c)
self == c
end
# Returns a hash value for this Country.
def hash
code.hash
end
# Dumps this Country for marshalling.
def _dump(limit)
code
end
# Loads a marshalled Country.
def self._load(data)
Country.get(data)
end
private
# Loads in the index of countries if it hasn't already been loaded.
def self.load_index
unless @@index_loaded
require 'tzinfo/indexes/countries'
@@index_loaded = true
end
end
# Called by Country.new to initialize a new Country instance. The info
# parameter is a CountryInfo that defines the country.
def setup(info)
@info = info
end
end
end

View File

@@ -0,0 +1,53 @@
#--
# Copyright (c) 2006-2013 Philip Ross
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#++
module TZInfo
# The country index file includes CountryIndexDefinition which provides
# a country method used to define each country in the index.
#
# @private
module CountryIndexDefinition #:nodoc:
def self.append_features(base)
super
base.extend(ClassMethods)
base.instance_eval { @countries = {} }
end
# Class methods for inclusion.
#
# @private
module ClassMethods #:nodoc:
# Defines a country with an ISO 3166 country code, name and block. The
# block will be evaluated to obtain all the timezones for the country.
# Calls Country.country_defined with the definition of each country.
def country(code, name, &block)
@countries[code] = CountryInfo.new(code, name, &block)
end
# Returns a frozen hash of all the countries that have been defined in
# the index.
def countries
@countries.freeze
end
end
end
end

View File

@@ -0,0 +1,82 @@
#--
# Copyright (c) 2006-2013 Philip Ross
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#++
module TZInfo
# Class to store the data loaded from the country index. Instances of this
# class are passed to the blocks in the index that define timezones.
#
# @private
class CountryInfo #:nodoc:
attr_reader :code
attr_reader :name
# Constructs a new CountryInfo with an ISO 3166 country code, name and
# block. The block will be evaluated to obtain the timezones for the country
# (when they are first needed).
def initialize(code, name, &block)
@code = code
@name = name
@block = block
@zones = nil
@zone_identifiers = nil
end
# Called by the index data to define a timezone for the country.
def timezone(identifier, latitude_numerator, latitude_denominator,
longitude_numerator, longitude_denominator, description = nil)
# Currently only store the identifiers.
@zones << CountryTimezone.new(identifier, latitude_numerator,
latitude_denominator, longitude_numerator, longitude_denominator,
description)
end
# Returns a frozen array of all the zone identifiers for the country. These
# are in the order they were added using the timezone method.
def zone_identifiers
unless @zone_identifiers
@zone_identifiers = zones.collect {|zone| zone.identifier}
@zone_identifiers.freeze
end
@zone_identifiers
end
# Returns internal object state as a programmer-readable string.
def inspect
"#<#{self.class}: #@code>"
end
# Returns a frozen array of all the timezones for the for the country as
# CountryTimezone instances. These are in the order they were added using
# the timezone method.
def zones
unless @zones
@zones = []
@block.call(self) if @block
@block = nil
@zones.freeze
end
@zones
end
end
end

View File

@@ -0,0 +1,100 @@
#--
# Copyright (c) 2006-2013 Philip Ross
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#++
module TZInfo
# A Timezone within a Country. This contains extra information about the
# Timezone that is specific to the Country (a Timezone could be used by
# multiple countries).
class CountryTimezone
# The zone identifier.
attr_reader :identifier
# A description of this timezone in relation to the country, e.g.
# "Eastern Time". This is usually nil for countries having only a single
# Timezone.
attr_reader :description
# Creates a new CountryTimezone with a timezone identifier, latitude,
# longitude and description. The latitude and longitude are specified as
# rationals - a numerator and denominator. For performance reasons, the
# numerators and denominators must be specified in their lowest form.
#
# CountryTimezone instances should not normally be constructed manually.
def initialize(identifier, latitude_numerator, latitude_denominator,
longitude_numerator, longitude_denominator, description = nil) #:nodoc:
@identifier = identifier
@latitude_numerator = latitude_numerator
@latitude_denominator = latitude_denominator
@longitude_numerator = longitude_numerator
@longitude_denominator = longitude_denominator
@description = description
end
# The Timezone (actually a TimezoneProxy for performance reasons).
def timezone
Timezone.get_proxy(@identifier)
end
# if description is not nil, this method returns description; otherwise it
# returns timezone.friendly_identifier(true).
def description_or_friendly_identifier
description || timezone.friendly_identifier(true)
end
# The latitude of this timezone in degrees as a Rational.
def latitude
@latitude ||= RubyCoreSupport.rational_new!(@latitude_numerator, @latitude_denominator)
end
# The longitude of this timezone in degrees as a Rational.
def longitude
@longitude ||= RubyCoreSupport.rational_new!(@longitude_numerator, @longitude_denominator)
end
# Returns true if and only if the given CountryTimezone is equal to the
# current CountryTimezone (has the same identifer, latitude, longitude
# and description).
def ==(ct)
ct.kind_of?(CountryTimezone) &&
identifier == ct.identifier && latitude == ct.latitude &&
longitude == ct.longitude && description == ct.description
end
# Returns true if and only if the given CountryTimezone is equal to the
# current CountryTimezone (has the same identifer, latitude, longitude
# and description).
def eql?(ct)
self == ct
end
# Returns a hash of this CountryTimezone.
def hash
@identifier.hash ^ @latitude_numerator.hash ^ @latitude_denominator.hash ^
@longitude_numerator.hash ^ @longitude_denominator.hash ^ @description.hash
end
# Returns internal object state as a programmer-readable string.
def inspect
"#<#{self.class}: #@identifier>"
end
end
end

View File

@@ -1,5 +1,5 @@
#--
# Copyright (c) 2006 Philip Ross
# Copyright (c) 2006-2013 Philip Ross
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -20,11 +20,11 @@
# THE SOFTWARE.
#++
require 'tzinfo/info_timezone'
module TZInfo
# A Timezone based on a DataTimezoneInfo.
#
# @private
class DataTimezone < InfoTimezone #:nodoc:
# Returns the TimezonePeriod for the given UTC time. utc can either be

View File

@@ -1,5 +1,5 @@
#--
# Copyright (c) 2006 Philip Ross
# Copyright (c) 2006-2013 Philip Ross
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -20,12 +20,6 @@
# THE SOFTWARE.
#++
require 'tzinfo/time_or_datetime'
require 'tzinfo/timezone_info'
require 'tzinfo/timezone_offset_info'
require 'tzinfo/timezone_period'
require 'tzinfo/timezone_transition_info'
module TZInfo
# Thrown if no offsets have been defined when calling period_for_utc or
# periods_for_local. Indicates an error in the timezone data.
@@ -33,6 +27,8 @@ module TZInfo
end
# Represents a (non-linked) timezone defined in a data module.
#
# @private
class DataTimezoneInfo < TimezoneInfo #:nodoc:
# Constructs a new TimezoneInfo with its identifier.

View File

@@ -0,0 +1,16 @@
module TZInfo
module Definitions
module Africa
module Abidjan
include TimezoneDefinition
timezone 'Africa/Abidjan' do |tz|
tz.offset :o0, -968, 0, :LMT
tz.offset :o1, 0, 0, :GMT
tz.transition 1912, 1, :o1, 26129547121, 10800
end
end
end
end
end

View File

@@ -0,0 +1,31 @@
module TZInfo
module Definitions
module Africa
module Accra
include TimezoneDefinition
timezone 'Africa/Accra' do |tz|
tz.offset :o0, -52, 0, :LMT
tz.offset :o1, 0, 0, :GMT
tz.offset :o2, 0, 1200, :GHST
tz.transition 1918, 1, :o1, 52306441213, 21600
tz.transition 1936, 9, :o2, 4856825, 2
tz.transition 1936, 12, :o1, 174854411, 72
tz.transition 1937, 9, :o2, 4857555, 2
tz.transition 1937, 12, :o1, 174880691, 72
tz.transition 1938, 9, :o2, 4858285, 2
tz.transition 1938, 12, :o1, 174906971, 72
tz.transition 1939, 9, :o2, 4859015, 2
tz.transition 1939, 12, :o1, 174933251, 72
tz.transition 1940, 9, :o2, 4859747, 2
tz.transition 1940, 12, :o1, 174959603, 72
tz.transition 1941, 9, :o2, 4860477, 2
tz.transition 1941, 12, :o1, 174985883, 72
tz.transition 1942, 9, :o2, 4861207, 2
tz.transition 1942, 12, :o1, 175012163, 72
end
end
end
end
end

View File

@@ -0,0 +1,18 @@
module TZInfo
module Definitions
module Africa
module Addis_Ababa
include TimezoneDefinition
timezone 'Africa/Addis_Ababa' do |tz|
tz.offset :o0, 9288, 0, :LMT
tz.offset :o1, 9320, 0, :ADMT
tz.offset :o2, 10800, 0, :EAT
tz.transition 1869, 12, :o1, 961625357, 400
tz.transition 1936, 5, :o2, 5245113727, 2160
end
end
end
end
end

View File

@@ -0,0 +1,20 @@
module TZInfo
module Definitions
module Africa
module Asmara
include TimezoneDefinition
timezone 'Africa/Asmara' do |tz|
tz.offset :o0, 9332, 0, :LMT
tz.offset :o1, 9332, 0, :AMT
tz.offset :o2, 9320, 0, :ADMT
tz.offset :o3, 10800, 0, :EAT
tz.transition 1869, 12, :o1, 51927769267, 21600
tz.transition 1889, 12, :o2, 52085557267, 21600
tz.transition 1936, 5, :o3, 5245113727, 2160
end
end
end
end
end

View File

@@ -0,0 +1,11 @@
module TZInfo
module Definitions
module Africa
module Asmera
include TimezoneDefinition
linked_timezone 'Africa/Asmera', 'Africa/Asmara'
end
end
end
end

View File

@@ -0,0 +1,19 @@
module TZInfo
module Definitions
module Africa
module Bamako
include TimezoneDefinition
timezone 'Africa/Bamako' do |tz|
tz.offset :o0, -1920, 0, :LMT
tz.offset :o1, 0, 0, :GMT
tz.offset :o2, -3600, 0, :WAT
tz.transition 1912, 1, :o1, 217746227, 90
tz.transition 1934, 2, :o2, 4854989, 2
tz.transition 1960, 6, :o1, 58490533, 24
end
end
end
end
end

View File

@@ -0,0 +1,16 @@
module TZInfo
module Definitions
module Africa
module Bangui
include TimezoneDefinition
timezone 'Africa/Bangui' do |tz|
tz.offset :o0, 4460, 0, :LMT
tz.offset :o1, 3600, 0, :WAT
tz.transition 1911, 12, :o1, 10451818577, 4320
end
end
end
end
end

View File

@@ -0,0 +1,20 @@
module TZInfo
module Definitions
module Africa
module Banjul
include TimezoneDefinition
timezone 'Africa/Banjul' do |tz|
tz.offset :o0, -3996, 0, :LMT
tz.offset :o1, -3996, 0, :BMT
tz.offset :o2, -3600, 0, :WAT
tz.offset :o3, 0, 0, :GMT
tz.transition 1912, 1, :o1, 1935522037, 800
tz.transition 1935, 1, :o2, 1942242837, 800
tz.transition 1964, 1, :o3, 58521493, 24
end
end
end
end
end

View File

@@ -0,0 +1,18 @@
module TZInfo
module Definitions
module Africa
module Bissau
include TimezoneDefinition
timezone 'Africa/Bissau' do |tz|
tz.offset :o0, -3740, 0, :LMT
tz.offset :o1, -3600, 0, :WAT
tz.offset :o2, 0, 0, :GMT
tz.transition 1911, 5, :o1, 10450868587, 4320
tz.transition 1975, 1, :o2, 157770000
end
end
end
end
end

View File

@@ -0,0 +1,16 @@
module TZInfo
module Definitions
module Africa
module Blantyre
include TimezoneDefinition
timezone 'Africa/Blantyre' do |tz|
tz.offset :o0, 8400, 0, :LMT
tz.offset :o1, 7200, 0, :CAT
tz.transition 1903, 2, :o1, 173964557, 72
end
end
end
end
end

Some files were not shown because too many files have changed in this diff Show More