ffi-icu 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4c6460cc9846ff7b59e5d7cc3e29f282dbd1c3ed
4
- data.tar.gz: 372510f4cf947a6a0c6ad7be888248af031d46b7
3
+ metadata.gz: 61818359548264beab4f803a6d4b6873eb9796f9
4
+ data.tar.gz: 5cffff3be406e40154bc45c51b2e199d3b36eb9c
5
5
  SHA512:
6
- metadata.gz: 05b809f5767f4cda9dd2973f798940ad43929a9458960af92fbe531007ef5b97d970ebe3daec5c0c5f706e7582a744c546d88a1e8c81e926aba0a63c3f199ede
7
- data.tar.gz: 2449ec2079f3ea4db73e4b0b9e8b71f20a9460ed0d2fd4b70798e0aced6d21893ff92909859201f059be7de648def0baee42dc7aab853c5d06e36385b74302ae
6
+ metadata.gz: 4f212ef09319ea71ea83493578d659c8e44d8be59a5d9afeb72f14bfd08ca834e00026cf397eba9ebb8737011455bc4c717fd66b3684c00e6515409d80560ccb
7
+ data.tar.gz: 0ab9f362d3d94351fc720f95d90ab3718a299e0061a6fec80a2ae690d2a8d44556a8ef73d22d25b50f2d684c1a9dc2bd625030b9c05f2548406c48bde810b5ae
data/README.md CHANGED
@@ -101,6 +101,27 @@ Examples:
101
101
  curf.format(1234.56, 'USD') #=> "$1,234.56"
102
102
  ```
103
103
 
104
+ Time Formatting/Parsing
105
+ --------------------------
106
+
107
+ Examples:
108
+
109
+ ```ruby
110
+ # class method interface
111
+ f = ICU::TimeFormatting.format(Time.mktime(2015, 11, 12, 15, 21, 16), {:locale => 'cs_CZ', :zone => 'Europe/Prague', :date => :short, :time => :short})
112
+ f #=> "12.11.15 15:21"
113
+
114
+ # reusable formatting objects
115
+ formater = ICU::TimeFormatting.create(:locale => 'cs_CZ', :zone => 'Europe/Prague', :date => :long , :time => :none)
116
+ formater.format(Time.now) #=> "25. února 2015"
117
+ ```
118
+
119
+ ```ruby
120
+ # reusable formatting objects
121
+ formater = ICU::TimeFormatting.create(:locale => 'cs_CZ', :zone => 'Europe/Prague', :date => :long , :time => :none)
122
+ formater.parse("25. února 2015") #=> Wed Feb 25 00:00:00 +0100 2015
123
+ ```
124
+
104
125
  Tested on:
105
126
  ==========
106
127
 
@@ -40,4 +40,5 @@ require "ffi-icu/transliteration"
40
40
  require "ffi-icu/normalization"
41
41
  require "ffi-icu/break_iterator"
42
42
  require "ffi-icu/number_formatting"
43
+ require "ffi-icu/time_formatting"
43
44
 
@@ -409,6 +409,23 @@ module ICU
409
409
  end
410
410
  attach_function :unum_format_currency, "unum_formatDoubleCurrency#{suffix}", [:pointer, :double, :pointer, :pointer, :int32_t, :pointer, :pointer], :int32_t
411
411
  attach_function :unum_set_attribute, "unum_setAttribute#{suffix}", [:pointer, :number_format_attribute, :int32_t], :void
412
+ # date
413
+ enum :date_format_style, [
414
+ :none, -1,
415
+ :full, 0,
416
+ :long, 1,
417
+ :medium, 2,
418
+ :short, 3,
419
+ ]
420
+ attach_function :udat_open, "udat_open#{suffix}", [:date_format_style, :date_format_style, :string, :pointer, :int32_t, :pointer, :int32_t, :pointer ], :pointer
421
+ attach_function :udat_close, "unum_close#{suffix}", [:pointer], :void
422
+ attach_function :udat_format, "udat_format#{suffix}", [:pointer, :double, :pointer, :int32_t, :pointer, :pointer], :int32_t
423
+ attach_function :udat_parse, "udat_parse#{suffix}", [:pointer, :pointer, :int32_t, :pointer, :pointer], :double
424
+ attach_function :udat_toPattern, "udat_toPattern#{suffix}", [:pointer, :bool , :pointer, :int32_t , :pointer], :int32_t
425
+ attach_function :udat_applyPattern, "udat_applyPattern#{suffix}", [:pointer, :bool , :pointer, :int32_t ], :void
426
+ # tz
427
+ attach_function :ucal_setDefaultTimeZone, "ucal_setDefaultTimeZone#{suffix}", [:pointer, :pointer], :int32_t
428
+ attach_function :ucal_getDefaultTimeZone, "ucal_getDefaultTimeZone#{suffix}", [:pointer, :int32_t, :pointer], :int32_t
412
429
 
413
430
  end # Lib
414
431
  end # ICU
@@ -81,7 +81,7 @@ module ICU
81
81
  needed_length = Lib.unum_format_int64(@f, number, out_ptr, needed_length, nil, error)
82
82
  end
83
83
  end
84
- out_ptr.string
84
+ out_ptr.string needed_length
85
85
  rescue BufferOverflowError
86
86
  raise BufferOverflowError, "needed: #{needed_length}" if retried
87
87
  out_ptr = out_ptr.resized_to needed_length
@@ -115,7 +115,7 @@ module ICU
115
115
 
116
116
  begin
117
117
  Lib.check_error do |error|
118
- needed_length = Lib.unum_format_currency(@f, number, UCharPointer.from_string(currency, 3), out_ptr, needed_length, nil, error)
118
+ needed_length = Lib.unum_format_currency(@f, number, UCharPointer.from_string(currency, 4), out_ptr, needed_length, nil, error)
119
119
  end
120
120
  out_ptr.string
121
121
  rescue BufferOverflowError
@@ -0,0 +1,181 @@
1
+
2
+ module ICU
3
+ module TimeFormatting
4
+ TZ_MAP = {
5
+ :generic_location => 'VVVV',# The generic location format.
6
+ # Where that is unavailable, falls back to the long localized GMT format ("OOOO";
7
+ # Note: Fallback is only necessary with a GMT-style Time Zone ID, like Etc/GMT-830.),
8
+ # This is especially useful when presenting possible timezone choices for user selection,
9
+ # since the naming is more uniform than the "v" format.
10
+ # such as "United States Time (New York)", "Italy Time"
11
+ :generic_long => 'vvvv', # The long generic non-location format.
12
+ # Where that is unavailable, falls back to generic location format ("VVVV")., such as "Eastern Time".
13
+ :generic_short => 'v', # The short generic non-location format.
14
+ # Where that is unavailable, falls back to the generic location format ("VVVV"),
15
+ # then the short localized GMT format as the final fallback., such as "ET".
16
+ :specific_long => 'zzzz', # The long specific non-location format.
17
+ # Where that is unavailable, falls back to the long localized GMT format ("OOOO").
18
+ :specific_short => 'z', # The short specific non-location format.
19
+ # Where that is unavailable, falls back to the short localized GMT format ("O").
20
+ :basic => 'Z', # The ISO8601 basic format with hours, minutes and optional seconds fields.
21
+ # The format is equivalent to RFC 822 zone format (when optional seconds field is absent).
22
+ # This is equivalent to the "xxxx" specifier.
23
+ :localized_long => 'ZZZZ', # The long localized GMT format. This is equivalent to the "OOOO" specifier, such as GMT-8:00
24
+ :extended => 'ZZZZZ', # The ISO8601 extended format with hours, minutes and optional seconds fields.
25
+ # The ISO8601 UTC indicator "Z" is used when local time offset is 0.
26
+ # This is equivalent to the "XXXXX" specifier, such as -08:00 -07:52:58
27
+ :localized_short => 'O', # The short localized GMT format, such as GMT-8
28
+ :localized_longO => 'OOOO', # The long localized GMT format, such as GMT-08:00
29
+ :tz_id_short => 'V', # The short time zone ID. Where that is unavailable,
30
+ # the special short time zone ID unk (Unknown Zone) is used.
31
+ # Note: This specifier was originally used for a variant of the short specific non-location format,
32
+ # but it was deprecated in the later version of this specification. In CLDR 23, the definition
33
+ # of the specifier was changed to designate a short time zone ID, such as uslax
34
+ :tz_id_long => 'VV', # The long time zone ID, such as America/Los_Angeles
35
+ :city_location => 'VVV', # The exemplar city (location) for the time zone. Where that is unavailable,
36
+ # the localized exemplar city name for the special zone Etc/Unknown is used as the fallback
37
+ # (for example, "Unknown City"), such as Los Angeles
38
+ # see: http://unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns
39
+ }
40
+ @default_options = {}
41
+
42
+ def self.create(options = {})
43
+ DateTimeFormatter.new(@default_options.merge(options))
44
+ end
45
+
46
+ def self.clear_default_options
47
+ @default_options.clear
48
+ end
49
+
50
+ def self.set_default_options(options)
51
+ @default_options.merge!(options)
52
+ end
53
+
54
+ def self.format(dt, options = {})
55
+ create(@default_options.merge(options)).format(dt)
56
+ end
57
+
58
+ class BaseFormatter
59
+
60
+ def set_attributes(options)
61
+ options.each { |key, value| Lib.unum_set_attribute(@f, key, value) }
62
+ self
63
+ end
64
+
65
+ private
66
+
67
+ def make_formatter(time_style, date_style, locale, time_zone_str)
68
+ time_zone = nil
69
+ d_len = 0
70
+ if time_zone_str
71
+ time_zone = UCharPointer.from_string(time_zone_str)
72
+ d_len = time_zone_str.size
73
+ else
74
+ Lib.check_error { | error|
75
+ i_len = 150
76
+ time_zone = UCharPointer.new(i_len)
77
+ d_len = Lib.ucal_getDefaultTimeZone(time_zone, i_len, error)
78
+ }
79
+ end
80
+
81
+ ptr = Lib.check_error { | error| Lib.udat_open(time_style, date_style, locale, time_zone, d_len, FFI::MemoryPointer.new(4), -1, error) }
82
+ FFI::AutoPointer.new(ptr, Lib.method(:udat_close))
83
+ end
84
+ end
85
+
86
+ class DateTimeFormatter < BaseFormatter
87
+ def initialize(options={})
88
+ time_style = options[:time] || :short
89
+ date_style = options[:date] || :short
90
+ locale = options[:locale] || 'C'
91
+ tz_style = options[:tz_style]
92
+ time_zone = options[:zone]
93
+ @f = make_formatter(time_style, date_style, locale, time_zone)
94
+ if tz_style
95
+ f0 = date_format(true)
96
+ f1 = update_tz_format(f0, tz_style)
97
+ if f1 != f0
98
+ set_date_format(true, f1)
99
+ end
100
+ end
101
+ end
102
+
103
+ def parse(str)
104
+ str_u = UCharPointer.from_string(str)
105
+ str_l = str_u.size
106
+ Lib.check_error do |error|
107
+ ret = Lib.udat_parse(@f, str_u, str_l, nil, error)
108
+ Time.at(ret / 1000.0)
109
+ end
110
+ end
111
+
112
+ def format(dt)
113
+ needed_length = 0
114
+ out_ptr = UCharPointer.new(needed_length)
115
+
116
+ retried = false
117
+
118
+ begin
119
+ Lib.check_error do |error|
120
+ case dt
121
+ when Date
122
+ needed_length = Lib.udat_format(@f, Time.mktime( dt.year, dt.month, dt.day, 0, 0, 0, 0 ).to_f * 1000.0, out_ptr, needed_length, nil, error)
123
+ when Time
124
+ needed_length = Lib.udat_format(@f, dt.to_f * 1000.0, out_ptr, needed_length, nil, error)
125
+ end
126
+ end
127
+
128
+ out_ptr.string
129
+ rescue BufferOverflowError
130
+ raise BufferOverflowError, "needed: #{needed_length}" if retried
131
+ out_ptr = out_ptr.resized_to needed_length
132
+ retried = true
133
+ retry
134
+ end
135
+ end
136
+
137
+ # time-zone formating
138
+ def update_tz_format(format, tz_style)
139
+ return format if format !~ /(.*?)(\s*(?:[zZOVV]+\s*))(.*?)/
140
+ pre, tz, suff = $1, $2, $3
141
+ if tz_style == :none
142
+ tz = ((tz =~ /\s/) && !pre.empty? && !suff.empty?) ? ' ' : ''
143
+ else
144
+ repl = TZ_MAP[tz_style]
145
+ raise 'no such tz_style' unless repl
146
+ tz.gsub!(/^(\s*)(.*?)(\s*)$/, '\1'+repl+'\3')
147
+ end
148
+ pre + tz + suff
149
+ end
150
+
151
+ def date_format(localized=true)
152
+ needed_length = 0
153
+ out_ptr = UCharPointer.new(needed_length)
154
+
155
+ retried = false
156
+
157
+ begin
158
+ Lib.check_error do |error|
159
+ needed_length = Lib.udat_toPattern(@f, localized, out_ptr, needed_length, error)
160
+ end
161
+
162
+ out_ptr.string
163
+ rescue BufferOverflowError
164
+ raise BufferOverflowError, "needed: #{needed_length}" if retried
165
+ out_ptr = out_ptr.resized_to needed_length
166
+ retried = true
167
+ retry
168
+ end
169
+ end
170
+
171
+ def set_date_format(localized, pattern_str)
172
+ pattern = UCharPointer.from_string(pattern_str)
173
+ pattern_len = pattern_str.size
174
+
175
+ Lib.check_error do |error|
176
+ needed_length = Lib.udat_applyPattern(@f, localized, pattern, pattern_len)
177
+ end
178
+ end
179
+ end # DateTimeFormatter
180
+ end # Formatting
181
+ end # ICU
@@ -23,8 +23,6 @@ module ICU
23
23
  class Transliterator
24
24
 
25
25
  def initialize(id, rules = nil, direction = :forward)
26
- warn 'the ffi-icu transliteration support is broken, see https://github.com/jarib/ffi-icu/issues/15'
27
-
28
26
  rules_length = 0
29
27
 
30
28
  if rules
@@ -47,8 +45,8 @@ module ICU
47
45
  # this is a bit unpleasant
48
46
 
49
47
  unicode_size = from.unpack("U*").size
50
- capacity = from.bytesize + 1
51
- buf = UCharPointer.from_string(from)
48
+ capacity = unicode_size + 1
49
+ buf = UCharPointer.from_string(from, capacity)
52
50
  limit = FFI::MemoryPointer.new :int32
53
51
  text_length = FFI::MemoryPointer.new :int32
54
52
 
@@ -6,20 +6,19 @@ module ICU
6
6
 
7
7
  def self.from_string(str, capacity = nil)
8
8
  str = str.encode("UTF-8") if str.respond_to? :encode
9
- bytes = str.unpack("U*")
9
+ chars = str.unpack("U*")
10
10
 
11
11
  if capacity
12
- capacity *= TYPE_SIZE
13
- if capacity < bytes.size
14
- raise ArgumentError, "capacity is too small for string of #{bytes.size} bytes"
12
+ if capacity < chars.size
13
+ raise ArgumentError, "capacity is too small for string of #{chars.size} UChars"
15
14
  end
16
15
 
17
16
  ptr = new capacity
18
17
  else
19
- ptr = new bytes.size
18
+ ptr = new chars.size
20
19
  end
21
20
 
22
- ptr.write_array_of_uint16 bytes
21
+ ptr.write_array_of_uint16 chars
23
22
 
24
23
  ptr
25
24
  end
@@ -1,3 +1,3 @@
1
1
  module ICU
2
- VERSION = "0.1.6"
2
+ VERSION = "0.1.7"
3
3
  end
@@ -0,0 +1,90 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ module ICU
6
+ describe TimeFormatting do
7
+ describe 'the TimeFormatting ' do
8
+ t0 = Time.at(1226499676) # in TZ=Europe/Prague Time.mktime(2008, 11, 12, 15, 21, 16)
9
+ t1 = Time.at(1224890117) # in TZ=Europe/Prague Time.mktime(2008, 10, 25, 01, 15, 17)
10
+ t2 = Time.at(1224893778) # in TZ=Europe/Prague Time.mktime(2008, 10, 25, 02, 16, 18)
11
+ t3 = Time.at(1224897439) # in TZ=Europe/Prague Time.mktime(2008, 10, 25, 03, 17, 19)
12
+ t4 = Time.at(1224901100) # in TZ=Europe/Prague Time.mktime(2008, 10, 25, 04, 18, 20)
13
+ t5 = Time.at(1206750921) # in TZ=Europe/Prague Time.mktime(2008, 03, 29, 01, 35, 21)
14
+ t6 = Time.at(1206754582) # in TZ=Europe/Prague Time.mktime(2008, 03, 29, 02, 36, 22)
15
+ t7 = Time.at(1206758243) # in TZ=Europe/Prague Time.mktime(2008, 03, 29, 03, 37, 23)
16
+ t8 = Time.at(1206761904) # in TZ=Europe/Prague Time.mktime(2008, 03, 29, 04, 38, 24)
17
+
18
+ f1 = TimeFormatting.create(:locale => 'cs_CZ', :zone => 'Europe/Prague', :date => :long , :time => :long, :tz_style => :localized_long)
19
+ it 'check date_format for lang=cs_CZ' do
20
+ f1.date_format(true).should eql "d. MMMM y H:mm:ss ZZZZ"
21
+ f1.date_format(false).should eql "d. MMMM y H:mm:ss ZZZZ"
22
+ end
23
+
24
+ it "for lang=cs_CZ zone=Europe/Prague" do
25
+ f1.should be_an_instance_of TimeFormatting::DateTimeFormatter
26
+ f1.format(t0).should eql "12. listopadu 2008 15:21:16 GMT+01:00"
27
+ f1.format(t1).should eql "25. října 2008 1:15:17 GMT+02:00"
28
+ f1.format(t2).should eql "25. října 2008 2:16:18 GMT+02:00"
29
+ f1.format(t3).should eql "25. října 2008 3:17:19 GMT+02:00"
30
+ f1.format(t4).should eql "25. října 2008 4:18:20 GMT+02:00"
31
+ f1.format(t5).should eql "29. března 2008 1:35:21 GMT+01:00"
32
+ f1.format(t6).should eql "29. března 2008 2:36:22 GMT+01:00"
33
+ f1.format(t7).should eql "29. března 2008 3:37:23 GMT+01:00"
34
+ f1.format(t8).should eql "29. března 2008 4:38:24 GMT+01:00"
35
+ end
36
+
37
+ f2 = TimeFormatting.create(:locale => 'en_US', :zone => 'Europe/Moscow', :date => :short , :time => :long, :tz_style => :generic_location)
38
+ cldr_version = Lib.cldr_version.to_s
39
+ en_tz = "Moscow Time"
40
+ en_sep = ","
41
+ if cldr_version <= "2.0.1"
42
+ en_tz = "Russia Time (Moscow)"
43
+ en_sep = ""
44
+ end
45
+
46
+ en_exp = "M/d/yy#{en_sep} h:mm:ss a VVVV"
47
+ it 'check date_format for lang=en_US' do
48
+ f2.date_format(true).should eql en_exp
49
+ f2.date_format(false).should eql en_exp
50
+ end
51
+
52
+ it "lang=en_US zone=Europe/Moscow" do
53
+ f2.format(t0).should eql "11/12/08#{en_sep} 5:21:16 PM #{en_tz}"
54
+ f2.format(t1).should eql "10/25/08#{en_sep} 3:15:17 AM #{en_tz}"
55
+ f2.format(t2).should eql "10/25/08#{en_sep} 4:16:18 AM #{en_tz}"
56
+ f2.format(t3).should eql "10/25/08#{en_sep} 5:17:19 AM #{en_tz}"
57
+ f2.format(t4).should eql "10/25/08#{en_sep} 6:18:20 AM #{en_tz}"
58
+ f2.format(t5).should eql "3/29/08#{en_sep} 3:35:21 AM #{en_tz}"
59
+ f2.format(t6).should eql "3/29/08#{en_sep} 4:36:22 AM #{en_tz}"
60
+ f2.format(t7).should eql "3/29/08#{en_sep} 5:37:23 AM #{en_tz}"
61
+ f2.format(t8).should eql "3/29/08#{en_sep} 6:38:24 AM #{en_tz}"
62
+ end
63
+
64
+ f3 = TimeFormatting.create(:locale => 'de_DE', :zone => 'Africa/Dakar ', :date => :short , :time => :long)
65
+ ge_sep = ""
66
+ if cldr_version >= "27.0.1"
67
+ ge_sep = ","
68
+ end
69
+
70
+ ge_exp = "dd.MM.yy#{ge_sep} HH:mm:ss z"
71
+ it 'check date_format for lang=de_DE' do
72
+ f3.date_format(true).should eql ge_exp
73
+ f3.date_format(false).should eql ge_exp
74
+ end
75
+
76
+ it "lang=de_DE zone=Africa/Dakar" do
77
+ f3.format(t0).should eql "12.11.08#{ge_sep} 14:21:16 GMT"
78
+ f3.format(t1).should eql "24.10.08#{ge_sep} 23:15:17 GMT"
79
+ f3.format(t2).should eql "25.10.08#{ge_sep} 00:16:18 GMT"
80
+ f3.format(t3).should eql "25.10.08#{ge_sep} 01:17:19 GMT"
81
+ f3.format(t4).should eql "25.10.08#{ge_sep} 02:18:20 GMT"
82
+ f3.format(t5).should eql "29.03.08#{ge_sep} 00:35:21 GMT"
83
+ f3.format(t6).should eql "29.03.08#{ge_sep} 01:36:22 GMT"
84
+ f3.format(t7).should eql "29.03.08#{ge_sep} 02:37:23 GMT"
85
+ f3.format(t8).should eql "29.03.08#{ge_sep} 03:38:24 GMT"
86
+ end
87
+ end
88
+ end
89
+ end
90
+
@@ -3,7 +3,7 @@
3
3
  require "spec_helper"
4
4
 
5
5
  module ICU
6
- describe Transliteration::Transliterator, broken: true do
6
+ describe Transliteration::Transliterator do
7
7
  def transliterator_for(*args)
8
8
  Transliteration::Transliterator.new(*args)
9
9
  end
@@ -11,7 +11,8 @@ module ICU
11
11
  [
12
12
  ["Any-Hex", "abcde", "\\u0061\\u0062\\u0063\\u0064\\u0065"],
13
13
  ["Lower", "ABC", "abc"],
14
- ["en", "雙屬性集合之空間分群演算法-應用於地理資料", "shuāng shǔ xìng jí hé zhī kōng jiān fēn qún yǎn suàn fǎ-yīng yòng yú de lǐ zī liào"]
14
+ ["en", "雙屬性集合之空間分群演算法-應用於地理資料", "shuāng shǔ xìng jí hé zhī kōng jiān fēn qún yǎn suàn fǎ-yīng yòng yú de lǐ zī liào"],
15
+ ["Devanagari-Latin", "दौलत", "daulata"]
15
16
  ].each do |id, input, output|
16
17
  it "should transliterate #{id}" do
17
18
  tl = transliterator_for(id)
@@ -21,7 +22,7 @@ module ICU
21
22
  end
22
23
  end # Transliterator
23
24
 
24
- describe Transliteration, broken: true do
25
+ describe Transliteration do
25
26
  it "should provide a list of available ids" do
26
27
  ids = ICU::Transliteration.available_ids
27
28
  ids.should be_kind_of(Array)
@@ -17,7 +17,7 @@ module ICU
17
17
 
18
18
  it 'takes an optional capacity' do
19
19
  ptr = UCharPointer.from_string('abc', 5)
20
- ptr.size.should == 20
20
+ ptr.size.should == 10
21
21
  end
22
22
 
23
23
  describe 'converting to string' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ffi-icu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jari Bakken
@@ -14,48 +14,48 @@ dependencies:
14
14
  name: ffi
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.0'
20
- - - '>='
20
+ - - ">="
21
21
  - !ruby/object:Gem::Version
22
22
  version: 1.0.9
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
- - - ~>
27
+ - - "~>"
28
28
  - !ruby/object:Gem::Version
29
29
  version: '1.0'
30
- - - '>='
30
+ - - ">="
31
31
  - !ruby/object:Gem::Version
32
32
  version: 1.0.9
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: rspec
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - ~>
37
+ - - "~>"
38
38
  - !ruby/object:Gem::Version
39
39
  version: 2.5.0
40
40
  type: :development
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - ~>
44
+ - - "~>"
45
45
  - !ruby/object:Gem::Version
46
46
  version: 2.5.0
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rake
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - ~>
51
+ - - "~>"
52
52
  - !ruby/object:Gem::Version
53
53
  version: 0.9.2
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - ~>
58
+ - - "~>"
59
59
  - !ruby/object:Gem::Version
60
60
  version: 0.9.2
61
61
  description: Provides charset detection, locale sensitive collation and more. Depends
@@ -67,9 +67,9 @@ extra_rdoc_files:
67
67
  - LICENSE
68
68
  - README.md
69
69
  files:
70
- - .document
71
- - .gitignore
72
- - .travis.yml
70
+ - ".document"
71
+ - ".gitignore"
72
+ - ".travis.yml"
73
73
  - Gemfile
74
74
  - LICENSE
75
75
  - README.md
@@ -87,6 +87,7 @@ files:
87
87
  - lib/ffi-icu/locale.rb
88
88
  - lib/ffi-icu/normalization.rb
89
89
  - lib/ffi-icu/number_formatting.rb
90
+ - lib/ffi-icu/time_formatting.rb
90
91
  - lib/ffi-icu/transliteration.rb
91
92
  - lib/ffi-icu/uchar.rb
92
93
  - lib/ffi-icu/version.rb
@@ -100,6 +101,7 @@ files:
100
101
  - spec/number_formatting_spec.rb
101
102
  - spec/spec.opts
102
103
  - spec/spec_helper.rb
104
+ - spec/time_spec.rb
103
105
  - spec/transliteration_spec.rb
104
106
  - spec/uchar_spec.rb
105
107
  - test.c
@@ -108,22 +110,22 @@ licenses: []
108
110
  metadata: {}
109
111
  post_install_message:
110
112
  rdoc_options:
111
- - --charset=UTF-8
113
+ - "--charset=UTF-8"
112
114
  require_paths:
113
115
  - lib
114
116
  required_ruby_version: !ruby/object:Gem::Requirement
115
117
  requirements:
116
- - - '>='
118
+ - - ">="
117
119
  - !ruby/object:Gem::Version
118
120
  version: '0'
119
121
  required_rubygems_version: !ruby/object:Gem::Requirement
120
122
  requirements:
121
- - - '>='
123
+ - - ">="
122
124
  - !ruby/object:Gem::Version
123
125
  version: '0'
124
126
  requirements: []
125
127
  rubyforge_project:
126
- rubygems_version: 2.0.14
128
+ rubygems_version: 2.4.5
127
129
  signing_key:
128
130
  specification_version: 4
129
131
  summary: Simple Ruby FFI wrappers for things I need from ICU.
@@ -138,5 +140,6 @@ test_files:
138
140
  - spec/number_formatting_spec.rb
139
141
  - spec/spec.opts
140
142
  - spec/spec_helper.rb
143
+ - spec/time_spec.rb
141
144
  - spec/transliteration_spec.rb
142
145
  - spec/uchar_spec.rb