humanized 0.0.1.alpha → 0.0.1
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.
- data/lib/humanized.rb +23 -3
- data/lib/humanized/compiler.rb +36 -19
- data/lib/humanized/core_ext/array.rb +1 -1
- data/lib/humanized/core_ext/hash.rb +6 -2
- data/lib/humanized/core_ext/module.rb +2 -2
- data/lib/humanized/core_ext/nilclass.rb +1 -1
- data/lib/humanized/core_ext/object.rb +7 -1
- data/lib/humanized/core_ext/string.rb +1 -1
- data/lib/humanized/core_ext/symbol.rb +1 -1
- data/lib/humanized/humanizer.rb +188 -44
- data/lib/humanized/interpolater.rb +71 -0
- data/lib/humanized/interpolation/conjunctions.rb +6 -0
- data/lib/humanized/interpolation/date.rb +11 -3
- data/lib/humanized/{ref.rb → interpolation/default.rb} +9 -9
- data/lib/humanized/interpolation/german.rb +8 -6
- data/lib/humanized/interpolation/kng.rb +15 -7
- data/lib/humanized/interpolation/number.rb +69 -8
- data/lib/humanized/{scope.rb → query.rb} +77 -49
- data/lib/humanized/source.rb +37 -54
- data/lib/more/humanized/parser.rb +89 -0
- data/lib/more/humanized/parser/date.rb +0 -0
- data/lib/more/humanized/parser/numeric.rb +80 -0
- data/lib/more/humanized/parsing_humanizer.rb +73 -0
- metadata +59 -93
- data/lib/humanized/core_ext/date.rb +0 -21
- data/lib/humanized/core_ext/numeric.rb +0 -21
- data/lib/humanized/core_ext/time.rb +0 -21
data/lib/humanized/source.rb
CHANGED
@@ -19,7 +19,12 @@ module Humanized
|
|
19
19
|
# A source lets you lookup,store and load data needed for humanization.
|
20
20
|
class Source
|
21
21
|
|
22
|
+
VALUE_KEY = :_
|
23
|
+
|
24
|
+
NOT_NIL_LAMBDA = lambda{|x| !x.nil? }
|
25
|
+
|
22
26
|
def initialize(data = {})
|
27
|
+
#TODO: data should maybe deep-copied
|
23
28
|
@source = data
|
24
29
|
@sync = Sync.new
|
25
30
|
@loaded = Set.new
|
@@ -29,11 +34,11 @@ class Source
|
|
29
34
|
# Loads a data-file or a dir of data-files.
|
30
35
|
#
|
31
36
|
# @param [String] path to a dir or file
|
32
|
-
# @option opts [
|
37
|
+
# @option opts [Query] :query the root query, where the loaded data will be stored ( default: Root )
|
33
38
|
# @option opts [String] :grep a grep to be used when a dir is given ( default: '**/*.*' )
|
34
39
|
# @return self
|
35
40
|
def load(path,opts ={})
|
36
|
-
options = {:
|
41
|
+
options = {:query => Query::Root, :grep => '**/*.*'}.update(opts)
|
37
42
|
if File.directory?(path)
|
38
43
|
f = File.join(path,options[:grep])
|
39
44
|
package('grep:' + f) do
|
@@ -43,8 +48,8 @@ class Source
|
|
43
48
|
if data
|
44
49
|
xpath = file[path.size..(-1-File.extname(file).size)].split('/')
|
45
50
|
xpath.shift if xpath.first == ''
|
46
|
-
|
47
|
-
self.store(
|
51
|
+
xquery = options[:query]._(*xpath.map(&:to_sym))
|
52
|
+
self.store(xquery.first,data)
|
48
53
|
end
|
49
54
|
end
|
50
55
|
end
|
@@ -53,7 +58,7 @@ class Source
|
|
53
58
|
package('file:'+path) do
|
54
59
|
data = self.read_file(path)
|
55
60
|
if data
|
56
|
-
self.store(options[:
|
61
|
+
self.store(options[:query].first,data)
|
57
62
|
end
|
58
63
|
end
|
59
64
|
end
|
@@ -90,12 +95,14 @@ class Source
|
|
90
95
|
end
|
91
96
|
|
92
97
|
# Retrieves data
|
93
|
-
# @param [
|
98
|
+
# @param [Query, #each] query a query containing the paths to search for
|
94
99
|
# @return [String, Object, nil] data
|
95
|
-
def get(
|
96
|
-
|
97
|
-
|
98
|
-
|
100
|
+
def get(query, options = {})
|
101
|
+
default = options[:default]
|
102
|
+
accepts = options.fetch(:accepts,NOT_NIL_LAMBDA )
|
103
|
+
query.each do |path|
|
104
|
+
v = @source[path]
|
105
|
+
return v if accepts.call(v)
|
99
106
|
end
|
100
107
|
return default
|
101
108
|
end
|
@@ -104,66 +111,42 @@ class Source
|
|
104
111
|
# @param [Array] path a path to store the data at
|
105
112
|
# @param [Object] data the data to store
|
106
113
|
def store(path ,data)
|
107
|
-
store!(path, data)
|
108
|
-
end
|
109
|
-
|
110
|
-
protected
|
111
|
-
|
112
|
-
def store!(path ,str, hsh = @source)
|
113
114
|
@sync.synchronize(Sync::EX){
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
hshc = find(hshc, @source)
|
115
|
+
if data.kind_of? Hash
|
116
|
+
data.each do |key, value|
|
117
|
+
if key.kind_of? Array
|
118
|
+
store( path + key, value)
|
119
|
+
next
|
120
|
+
end
|
121
|
+
key = key.to_sym
|
122
|
+
if key == VALUE_KEY
|
123
|
+
store( path, value )
|
124
|
+
else
|
125
|
+
store( path + [key], value)
|
126
|
+
end
|
127
127
|
end
|
128
|
-
end
|
129
|
-
if str.kind_of? Hash
|
130
|
-
hshc.deep_merge!(str)
|
131
128
|
else
|
132
|
-
|
129
|
+
@source[path] = data
|
133
130
|
end
|
134
|
-
return nil
|
135
131
|
}
|
136
132
|
end
|
137
133
|
|
134
|
+
def inspect
|
135
|
+
"#<#{self.class.name}:#{self.object_id.to_s} | #{@source.size} key(s); loaded: #{@loaded.inspect}>"
|
136
|
+
end
|
137
|
+
|
138
|
+
protected
|
139
|
+
|
138
140
|
def read_file(file)
|
139
141
|
ext = File.extname(file)[1..-1]
|
140
142
|
meth = "read_#{ext}".to_sym
|
141
143
|
if self.respond_to?(meth)
|
142
144
|
return self.send(meth,file)
|
143
145
|
else
|
144
|
-
warn "No reader found for #{ext}."
|
146
|
+
Humanized.logger.warn "No reader found for #{ext}."
|
145
147
|
return nil
|
146
148
|
end
|
147
149
|
end
|
148
150
|
|
149
|
-
def find(path, hsh)
|
150
|
-
hshc = hsh
|
151
|
-
l = path.length - 1
|
152
|
-
(0...l).each do |i|
|
153
|
-
a = path[i]
|
154
|
-
return nil unless hshc.key?(a)
|
155
|
-
hshc = hshc[a]
|
156
|
-
while hshc.kind_of? Humanized::Ref
|
157
|
-
hshc = find(hshc, @source)
|
158
|
-
end
|
159
|
-
return nil unless hshc.respond_to? :[]
|
160
|
-
end
|
161
|
-
hshc = hshc[path[l]]
|
162
|
-
while hshc.kind_of? Humanized::Ref
|
163
|
-
hshc = find(hshc, @source)
|
164
|
-
end
|
165
|
-
return hshc
|
166
|
-
end
|
167
|
-
|
168
151
|
end
|
169
152
|
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
# This program is free software: you can redistribute it and/or modify
|
3
|
+
# it under the terms of the Affero GNU General Public License as published by
|
4
|
+
# the Free Software Foundation, either version 3 of the License, or
|
5
|
+
# (at your option) any later version.
|
6
|
+
#
|
7
|
+
# This program is distributed in the hope that it will be useful,
|
8
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
9
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
10
|
+
# GNU General Public License for more details.
|
11
|
+
#
|
12
|
+
# You should have received a copy of the GNU General Public License
|
13
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
14
|
+
#
|
15
|
+
# (c) 2011 by Hannes Georg
|
16
|
+
#
|
17
|
+
module Humanized
|
18
|
+
|
19
|
+
class Parser
|
20
|
+
|
21
|
+
class Result
|
22
|
+
|
23
|
+
attr_reader :parsed_string,
|
24
|
+
:original_string,
|
25
|
+
:value,
|
26
|
+
:options,
|
27
|
+
:success
|
28
|
+
|
29
|
+
def success?
|
30
|
+
@success
|
31
|
+
end
|
32
|
+
|
33
|
+
def call
|
34
|
+
if success?
|
35
|
+
yield @value
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def success
|
40
|
+
if block_given?
|
41
|
+
yield(@value) if @success
|
42
|
+
return self
|
43
|
+
end
|
44
|
+
@success
|
45
|
+
end
|
46
|
+
|
47
|
+
def failure
|
48
|
+
if block_given?
|
49
|
+
yield() unless success?
|
50
|
+
return self
|
51
|
+
end
|
52
|
+
!success?
|
53
|
+
end
|
54
|
+
|
55
|
+
def initialize(str, options ={}, &block)
|
56
|
+
s = str.dup.freeze
|
57
|
+
@original_string = s
|
58
|
+
@parsed_string = s
|
59
|
+
@options = options
|
60
|
+
@success = false
|
61
|
+
if block
|
62
|
+
instance_eval &block
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def emit(value, parsed_or_options = nil)
|
67
|
+
@value = value
|
68
|
+
@success = true
|
69
|
+
if parsed_or_options.kind_of? String
|
70
|
+
@parsed_string = parsed.dup.freeze
|
71
|
+
elsif parsed_or_options.kind_of? Hash
|
72
|
+
@options.update parsed_or_options
|
73
|
+
end
|
74
|
+
return self
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
class ParserMissing < Result
|
80
|
+
end
|
81
|
+
|
82
|
+
def provides
|
83
|
+
[]
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
File without changes
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
# This program is free software: you can redistribute it and/or modify
|
3
|
+
# it under the terms of the Affero GNU General Public License as published by
|
4
|
+
# the Free Software Foundation, either version 3 of the License, or
|
5
|
+
# (at your option) any later version.
|
6
|
+
#
|
7
|
+
# This program is distributed in the hope that it will be useful,
|
8
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
9
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
10
|
+
# GNU General Public License for more details.
|
11
|
+
#
|
12
|
+
# You should have received a copy of the GNU General Public License
|
13
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
14
|
+
#
|
15
|
+
# (c) 2011 by Hannes Georg
|
16
|
+
#
|
17
|
+
|
18
|
+
require "bigdecimal"
|
19
|
+
|
20
|
+
module Humanized
|
21
|
+
class Parser
|
22
|
+
class NumericClass < self
|
23
|
+
|
24
|
+
def parse(string, options)
|
25
|
+
|
26
|
+
humanizer = options[:humanizer]
|
27
|
+
if options.key? :default
|
28
|
+
scope = [:numeric, :format]._[options[:format], :default]
|
29
|
+
else
|
30
|
+
scope = [:numeric, :format, :default]._
|
31
|
+
end
|
32
|
+
|
33
|
+
separator = humanizer.get(scope.separator)
|
34
|
+
delimiter = humanizer.get(scope.delimiter)
|
35
|
+
pedantic = options.fetch(:pedantic, false)
|
36
|
+
|
37
|
+
result = Result.new(string, options)
|
38
|
+
|
39
|
+
|
40
|
+
if pedantic
|
41
|
+
regexp = Regexp.new([
|
42
|
+
'^(-?)(\d{1,3}(?:',
|
43
|
+
Regexp.escape(separator),
|
44
|
+
'\d{3})?)(',
|
45
|
+
Regexp.escape(delimiter),
|
46
|
+
'(\d+))?$'
|
47
|
+
].join)
|
48
|
+
else
|
49
|
+
regexp = Regexp.new([
|
50
|
+
'^(-?)([\d',
|
51
|
+
Regexp.escape(separator),
|
52
|
+
']+)(',
|
53
|
+
Regexp.escape(delimiter),
|
54
|
+
'(\d+))?$'
|
55
|
+
].join)
|
56
|
+
end
|
57
|
+
|
58
|
+
m = regexp.match(string)
|
59
|
+
|
60
|
+
if m.nil?
|
61
|
+
return result
|
62
|
+
end
|
63
|
+
|
64
|
+
result.emit( BigDecimal( [ m[1], m[2].gsub(separator,''), '.', m[4] ].join ), :precision => (m[4] ? m[4].length : 0) )
|
65
|
+
|
66
|
+
return result
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
def provides
|
71
|
+
return [:numeric]
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
Numeric = NumericClass.new
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
# This program is free software: you can redistribute it and/or modify
|
3
|
+
# it under the terms of the Affero GNU General Public License as published by
|
4
|
+
# the Free Software Foundation, either version 3 of the License, or
|
5
|
+
# (at your option) any later version.
|
6
|
+
#
|
7
|
+
# This program is distributed in the hope that it will be useful,
|
8
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
9
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
10
|
+
# GNU General Public License for more details.
|
11
|
+
#
|
12
|
+
# You should have received a copy of the GNU General Public License
|
13
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
14
|
+
#
|
15
|
+
# (c) 2011 by Hannes Georg
|
16
|
+
#
|
17
|
+
require 'humanized/humanizer'
|
18
|
+
require 'more/humanized/parser'
|
19
|
+
|
20
|
+
module Humanized
|
21
|
+
|
22
|
+
class ParsingHumanizer < Humanizer
|
23
|
+
|
24
|
+
component :parser do |value, old|
|
25
|
+
|
26
|
+
if old.kind_of? Hash
|
27
|
+
result = old.dup
|
28
|
+
else
|
29
|
+
result = {}
|
30
|
+
end
|
31
|
+
|
32
|
+
if value.kind_of? Hash
|
33
|
+
result.update value
|
34
|
+
elsif value.kind_of? Array
|
35
|
+
value.each do |parser|
|
36
|
+
if parser.respond_to? :provides
|
37
|
+
parser.provides.each do |provided|
|
38
|
+
result[provided] = parser
|
39
|
+
end
|
40
|
+
else
|
41
|
+
raise ArgumentError, "A parser should respond to :provides, got #{parser.inspect}."
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
result
|
46
|
+
end
|
47
|
+
|
48
|
+
def parse(type, string, options={})
|
49
|
+
|
50
|
+
options = options.dup
|
51
|
+
options[:humanizer] = self
|
52
|
+
options[:type] = type
|
53
|
+
|
54
|
+
p = parser[type]
|
55
|
+
|
56
|
+
if p.nil?
|
57
|
+
result = Parser::ParserMissing.new(string, options)
|
58
|
+
else
|
59
|
+
result = p.parse(string, options)
|
60
|
+
end
|
61
|
+
|
62
|
+
raise "Expected result to be a kind of Humanized::Parser::Result but #{result.inspect} given." unless result.kind_of? Parser::Result
|
63
|
+
|
64
|
+
if block_given? and result.success?
|
65
|
+
yield result.value
|
66
|
+
end
|
67
|
+
|
68
|
+
return result
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
metadata
CHANGED
@@ -1,149 +1,115 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: humanized
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 1
|
10
|
-
- alpha
|
11
|
-
version: 0.0.1.alpha
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
12
6
|
platform: ruby
|
13
|
-
authors:
|
7
|
+
authors:
|
14
8
|
- HannesG
|
15
9
|
autorequire:
|
16
10
|
bindir: bin
|
17
11
|
cert_chain: []
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
dependencies:
|
22
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-10-09 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
23
15
|
name: facets
|
24
|
-
|
16
|
+
requirement: &8246820 !ruby/object:Gem::Requirement
|
25
17
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
version: "0"
|
33
|
-
prerelease: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
34
22
|
type: :runtime
|
35
|
-
|
36
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *8246820
|
25
|
+
- !ruby/object:Gem::Dependency
|
37
26
|
name: rspec
|
38
|
-
|
27
|
+
requirement: &8246040 !ruby/object:Gem::Requirement
|
39
28
|
none: false
|
40
|
-
requirements:
|
41
|
-
- -
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
segments:
|
45
|
-
- 0
|
46
|
-
version: "0"
|
47
|
-
prerelease: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
48
33
|
type: :development
|
49
|
-
|
50
|
-
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *8246040
|
36
|
+
- !ruby/object:Gem::Dependency
|
51
37
|
name: simplecov
|
52
|
-
|
38
|
+
requirement: &8245520 !ruby/object:Gem::Requirement
|
53
39
|
none: false
|
54
|
-
requirements:
|
55
|
-
- -
|
56
|
-
- !ruby/object:Gem::Version
|
57
|
-
|
58
|
-
segments:
|
59
|
-
- 0
|
60
|
-
version: "0"
|
61
|
-
prerelease: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
62
44
|
type: :development
|
63
|
-
|
64
|
-
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *8245520
|
47
|
+
- !ruby/object:Gem::Dependency
|
65
48
|
name: rake
|
66
|
-
|
49
|
+
requirement: &8245060 !ruby/object:Gem::Requirement
|
67
50
|
none: false
|
68
|
-
requirements:
|
69
|
-
- -
|
70
|
-
- !ruby/object:Gem::Version
|
71
|
-
|
72
|
-
segments:
|
73
|
-
- 0
|
74
|
-
version: "0"
|
75
|
-
prerelease: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
76
55
|
type: :development
|
77
|
-
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *8245060
|
78
58
|
description: Sick of writing culture dependent code? humanized could be for you.
|
79
59
|
email: hannes.georg@googlemail.com
|
80
60
|
executables: []
|
81
|
-
|
82
61
|
extensions: []
|
83
|
-
|
84
62
|
extra_rdoc_files: []
|
85
|
-
|
86
|
-
files:
|
63
|
+
files:
|
87
64
|
- lib/more/humanized/yaml_source.rb
|
65
|
+
- lib/more/humanized/parser.rb
|
66
|
+
- lib/more/humanized/parser/date.rb
|
67
|
+
- lib/more/humanized/parser/numeric.rb
|
88
68
|
- lib/more/humanized/json_source.rb
|
69
|
+
- lib/more/humanized/parsing_humanizer.rb
|
89
70
|
- lib/humanized/humanizer.rb
|
90
71
|
- lib/humanized/compiler.rb
|
91
|
-
- lib/humanized/
|
72
|
+
- lib/humanized/query.rb
|
73
|
+
- lib/humanized/interpolater.rb
|
92
74
|
- lib/humanized/interpolation/date.rb
|
93
75
|
- lib/humanized/interpolation/german.rb
|
94
76
|
- lib/humanized/interpolation/number.rb
|
95
77
|
- lib/humanized/interpolation/english.rb
|
78
|
+
- lib/humanized/interpolation/default.rb
|
96
79
|
- lib/humanized/interpolation/kng.rb
|
97
80
|
- lib/humanized/interpolation/conjunctions.rb
|
98
81
|
- lib/humanized/core_ext/hash.rb
|
99
|
-
- lib/humanized/core_ext/date.rb
|
100
82
|
- lib/humanized/core_ext/array.rb
|
101
|
-
- lib/humanized/core_ext/time.rb
|
102
83
|
- lib/humanized/core_ext/object.rb
|
103
84
|
- lib/humanized/core_ext/module.rb
|
104
85
|
- lib/humanized/core_ext/string.rb
|
105
86
|
- lib/humanized/core_ext/nilclass.rb
|
106
|
-
- lib/humanized/core_ext/numeric.rb
|
107
87
|
- lib/humanized/core_ext/symbol.rb
|
108
88
|
- lib/humanized/source.rb
|
109
|
-
- lib/humanized/ref.rb
|
110
89
|
- lib/humanized/wrapper.rb
|
111
90
|
- lib/humanized.rb
|
112
|
-
has_rdoc: true
|
113
91
|
homepage: http://github.com/hannesg/humanized
|
114
92
|
licenses: []
|
115
|
-
|
116
93
|
post_install_message:
|
117
94
|
rdoc_options: []
|
118
|
-
|
119
|
-
require_paths:
|
95
|
+
require_paths:
|
120
96
|
- lib
|
121
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
97
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
122
98
|
none: false
|
123
|
-
requirements:
|
124
|
-
- -
|
125
|
-
- !ruby/object:Gem::Version
|
126
|
-
|
127
|
-
|
128
|
-
- 0
|
129
|
-
version: "0"
|
130
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
104
|
none: false
|
132
|
-
requirements:
|
133
|
-
- -
|
134
|
-
- !ruby/object:Gem::Version
|
135
|
-
|
136
|
-
segments:
|
137
|
-
- 1
|
138
|
-
- 3
|
139
|
-
- 1
|
140
|
-
version: 1.3.1
|
105
|
+
requirements:
|
106
|
+
- - ! '>='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
141
109
|
requirements: []
|
142
|
-
|
143
110
|
rubyforge_project:
|
144
|
-
rubygems_version: 1.
|
111
|
+
rubygems_version: 1.8.10
|
145
112
|
signing_key:
|
146
113
|
specification_version: 3
|
147
114
|
summary: advanced i18n for ruby
|
148
115
|
test_files: []
|
149
|
-
|