merb_global 0.0.5.2 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY CHANGED
@@ -1,3 +1,8 @@
1
+ === 0.0.6
2
+ * Introduction of Locale object
3
+ * Change of MessageProviders interface
4
+ * Per-enviroment configuration
5
+
1
6
  === 0.0.5
2
7
  * Handles lang_REGION as lang
3
8
  * Renamed providers into message providers and translate_to into localize
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ require 'fileutils'
6
6
 
7
7
  PLUGIN = "merb_global"
8
8
  NAME = "merb_global"
9
- GEM_VERSION = "0.0.5.2"
9
+ GEM_VERSION = "0.0.6"
10
10
  AUTHORS = ["Alex Coles", "Maciej Piechotka"]
11
11
  EMAIL = "alex@alexcolesportfolio.com"
12
12
  HOMEPAGE = "http://trac.ikonoklastik.com/merb_global/"
@@ -1,29 +1,53 @@
1
1
  require 'merb_global/config'
2
2
  require 'merb_global/plural'
3
+ require 'merb_global/locale'
3
4
  require 'merb_global/date_providers'
4
5
  require 'merb_global/message_providers'
5
6
  require 'merb_global/numeric_providers'
6
7
 
7
- module Merb
8
- module Global
9
- attr_accessor :lang, :message_provider, :date_provider, :numeric_provider
8
+ class String
9
+ def localize(args = {})
10
+ opts = {:locale => Merb::Global::Locale.current, :n => 1, :plural => nil}
11
+ opts.merge!(args)
12
+ Merb::Global::MessageProviders.provider.localize self, opts[:plural],
13
+ opts[:n], opts[:locale]
14
+ end
15
+ end
10
16
 
11
- def lang #:nodoc:
12
- @lang ||= 'en'
13
- end
17
+ class Numeric
18
+ def localize(args = {})
19
+ opts = {:locale => Merb::Global::Locale.current}
20
+ opts.merge!(args)
21
+ Merb::Global::NumericProviders.provider.localize opts[:locale], self
22
+ end
23
+ end
14
24
 
15
- def message_provider #:nodoc:
16
- @message_provider ||= Merb::Global::MessageProviders.provider
17
- end
25
+ class Date
26
+ def localize(format, args = {})
27
+ opts = {:locale => Merb::Global::Locale.current}
28
+ opts.merge!(args)
29
+ Merb::Global::DateProviders.provider.localize opts[:locale], self, format
30
+ end
31
+ end
18
32
 
19
- def date_provider #:nodoc:
20
- @date_provider ||= Merb::Global::DateProviders.provider
21
- end
33
+ class DateTime
34
+ def localize(format, args = {})
35
+ opts = {:locale => Merb::Global::Locale.current}
36
+ opts.merge!(args)
37
+ Merb::Global::DateProviders.provider.localize opts[:locale], self, format
38
+ end
39
+ end
22
40
 
23
- def numeric_provider #:nodoc:
24
- @numeric_provider ||= Merb::Global::NumericProviders.provider
25
- end
41
+ class Time
42
+ def localize(format, args = {})
43
+ opts = {:locale => Merb::Global::Locale.current}
44
+ opts.merge!(args)
45
+ Merb::Global::DateProviders.provider.localize opts[:locale], self, format
46
+ end
47
+ end
26
48
 
49
+ module Merb
50
+ module Global
27
51
  # call-seq:
28
52
  # _(singular, opts) => translated message
29
53
  # _(singlular, plural, opts) => translated message
@@ -40,7 +64,7 @@ module Merb
40
64
  # number<Numeric>:: A numeber to localize
41
65
  #
42
66
  # ==== Options (opts)
43
- # :lang<String>:: A language to translate on
67
+ # :locale<Locale>:: A language to translate on
44
68
  # :n<Fixnum>:: A number of objects (for messages)
45
69
  #
46
70
  # ==== Returns
@@ -49,25 +73,25 @@ module Merb
49
73
  # ==== Example
50
74
  # <tt>render _('%d file deleted', '%d files deleted', :n => del) % del</tt>
51
75
  def _(*args)
52
- opts = {:lang => self.lang, :n => 1}
76
+ opts = {:locale => Merb::Global::Locale.current, :n => 1}
53
77
  opts.merge! args.pop if args.last.is_a? Hash
54
78
  if args.first.respond_to? :strftime
55
79
  if args.size == 2
56
- self.date_provider.localize opts[:lang], args[0], args[1]
80
+ Merb::Global::DateProviders.provider.localize opts[:locale], args[0], args[1]
57
81
  else
58
82
  raise ArgumentError, "wrong number of arguments (#{args.size} for 2)"
59
83
  end
60
84
  elsif args.first.is_a? Numeric
61
85
  if args.size == 1
62
- self.numeric_provider.localize opts[:lang], args.first
86
+ Merb::Global::NumericProviders.provider.localize opts[:locale], args.first
63
87
  else
64
88
  raise ArgumentError, "wrong number of arguments (#{args.size} for 1)"
65
89
  end
66
90
  elsif args.first.is_a? String
67
91
  if args.size == 1
68
- self.message_provider.localize args[0], nil, opts
92
+ Merb::Global::MessageProviders.provider.localize args[0], nil, opts[:n], opts[:locale]
69
93
  elsif args.size == 2
70
- self.message_provider.localize args[0], args[1], opts
94
+ Merb::Global::MessageProviders.provider.localize args[0], args[1], opts[:n], opts[:locale]
71
95
  else
72
96
  raise ArgumentError,
73
97
  "wrong number of arguments (#{args.size} for 1-2)"
@@ -1,5 +1,6 @@
1
1
  module Merb
2
2
  module Global
3
+ @@config = nil
3
4
  # call-seq:
4
5
  # config(key) => value
5
6
  # config([key1, key2, ...]) => value
@@ -19,7 +20,13 @@ module Merb
19
20
  # <tt>Merb::Global.config [:gettext, :domain], 'merbapp'</tt>
20
21
  def self.config(keys, default = nil)
21
22
  keys = [keys] unless keys.is_a? Array
22
- current = Merb::Plugins.config[:merb_global]
23
+ #if @@config.nil?
24
+ @@config = Merb::Plugins.config[:merb_global].dup
25
+ unless Merb::Plugins.config[:merb_global][Merb.env].nil?
26
+ @@config.merge! Merb::Plugins.config[:merb_global][Merb.env]
27
+ end
28
+ #end
29
+ current = @@config
23
30
  while current.respond_to?(:[]) and not keys.empty?
24
31
  current = current[keys.shift]
25
32
  end
@@ -3,64 +3,62 @@ require 'merb_global/base'
3
3
  module Merb
4
4
  class Controller
5
5
  include Merb::Global
6
- class_inheritable_accessor :_language
6
+
7
+ class_inheritable_accessor :_mg_locale
7
8
 
8
9
  before do
9
10
  # Set up the language
10
11
  accept_language = self.request.env['HTTP_ACCEPT_LANGUAGE']
11
- self.lang = params[:language] ||
12
- (self._language && self.instance_eval(&self._language)) ||
12
+ Merb::Global::Locale.current =
13
+ Merb::Global::Locale.new(params[:locale]) ||
14
+ (self._mg_locale &&
15
+ Merb::Global::Locale.new(self.instance_eval(&self._mg_locale))) ||
13
16
  begin
14
17
  unless accept_language.nil?
15
- accept_language = accept_language.split(',')
16
- accept_language.collect! {|lang| lang.delete ' ' "\n" "\r" "\t"}
17
- accept_language.reject! {|lang| lang.empty?}
18
- accept_language.collect! {|lang| lang.split ';q='}
18
+ accept_language = Merb::Global::Locale.parse(accept_language)
19
19
  accept_language.collect! do |lang|
20
- if lang.size == 1
21
- [lang[0], 1.0]
22
- else
23
- [lang[0], lang[1].to_f]
24
- end
25
- end
26
- accept_language.sort! {|lang_a, lang_b| lang_a[1] <=> lang_b[1]}
27
- accept_language.collect! {|lang| lang[0]}
28
- accept_language_orig = accept_language.dup
29
- accept_language.collect! do |lang|
30
- if lang == '*'
31
- '*'
32
- elsif self.message_provider.support? lang
20
+ if lang.any?
21
+ lang
22
+ elsif Merb::Global::MessageProviders.provider.support? lang
33
23
  lang
34
- elsif lang.include? '-'
35
- lang = lang.split('-')[0]
36
- if self.message_provider.support? lang
24
+ else
25
+ lang = lang.base_locale
26
+ if not lang.nil? and Merb::Global::MessageProviders.provider.support? lang
37
27
  lang
38
28
  else
39
29
  nil
40
30
  end
41
- else
42
- nil
43
31
  end
44
32
  end
45
33
  accept_language.reject! {|lang| lang.nil?}
46
34
  unless accept_language.empty?
47
- unless accept_language.last == '*'
35
+ unless accept_language.last.any?
48
36
  accept_language.last
49
37
  else
50
38
  accept_language.pop
51
- self.message_provider.choose accept_language
39
+ Merb::Global::MessageProviders.provider.choose accept_language
52
40
  end
53
41
  end
54
42
  end
55
- end || 'en'
43
+ end || Merb::Global::Locale.new('en')
56
44
  end
57
45
 
58
46
  # Sets the language of block.
59
47
  #
60
48
  # The block should return language or nil if other method should be used
61
49
  # to determine the language
50
+ #
51
+ # Please note that this method is deprecated and the prefereed method is
52
+ # locale.
62
53
  def self.language(&block)
63
- self._language = block
54
+ self._mg_locale = block
55
+ end
56
+ # Sets the language of block.
57
+ #
58
+ # The block should return language or nil if other method should be used
59
+ # to determine the language
60
+ def self.locale(&block)
61
+ self._mg_locale = block
64
62
  end
65
63
  end
66
64
  end
@@ -10,7 +10,7 @@ module Merb
10
10
  pipe_rd, pipe_wr = IO.pipe
11
11
  pid = fork do
12
12
  pipe_rd.close
13
- setlocale(lang)
13
+ setlocale(lang.to_s)
14
14
  pipe_wr.write(date.strftime(format))
15
15
  pipe_wr.flush
16
16
  end
@@ -0,0 +1,96 @@
1
+ require 'merb_global/base'
2
+ require 'thread'
3
+ require 'weakref'
4
+
5
+ class Thread
6
+ attr_accessor :mg_locale
7
+ end
8
+
9
+ module Merb
10
+ module Global
11
+ class Locale
12
+ attr_reader :language, :country
13
+
14
+ def initialize(name)
15
+ # TODO: Understend RFC 1766 fully
16
+ @language, @country = name.split('-')
17
+ end
18
+
19
+ def any?
20
+ language == '*' && country.nil?\
21
+ end
22
+
23
+ def base_locale
24
+ if not @country.nil?
25
+ Locale.new(@language)
26
+ else
27
+ nil
28
+ end
29
+ end
30
+
31
+ def to_s
32
+ if country.nil?
33
+ "#{@language.downcase}"
34
+ else
35
+ "#{@language.downcase}_#{@country.upcase}"
36
+ end
37
+ end
38
+
39
+ def self.parse(header)
40
+ header = header.split(',')
41
+ header.collect! {|lang| lang.delete ' ' "\n" "\r" "\t"}
42
+ header.reject! {|lang| lang.empty?}
43
+ header.collect! {|lang| lang.split ';q='}
44
+ header.collect! do |lang|
45
+ if lang.size == 1
46
+ [lang[0], 1.0]
47
+ else
48
+ [lang[0], lang[1].to_f]
49
+ end
50
+ end
51
+ header.sort! {|lang_a, lang_b| lang_a[1] <=> lang_b[1]}
52
+ header.collect! {|lang| lang[0]}
53
+ return header.collect! {|lang| Locale.new(lang)}
54
+ end
55
+
56
+ def self.current
57
+ Thread.current.mg_locale
58
+ end
59
+
60
+ def self.current=(new_locale)
61
+ Thread.current.mg_locale = new_locale
62
+ end
63
+
64
+ class << self
65
+ alias_method :pure_new, :new
66
+ private :pure_new
67
+ end
68
+
69
+ @@current = {}
70
+ @@current_mutex = Mutex.new
71
+ # Create new locale object and returns it.
72
+ #
73
+ # Please note that this method is cached.
74
+ def self.new(name)
75
+ return nil if name.nil?
76
+ return name if name.is_a? Locale
77
+ @@current_mutex.synchronize do
78
+ begin
79
+ n = @@current[name]
80
+ if n.nil?
81
+ n = pure_new(name)
82
+ @@current[name] = WeakRef.new(n)
83
+ else
84
+ n = n.__getobj__
85
+ end
86
+ n
87
+ rescue WeakRef::RefError
88
+ n = pure_new(name)
89
+ @@current[name] = WeakRef.new(n)
90
+ n
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -13,13 +13,13 @@ module Merb
13
13
  include Merb::Global::MessageProviders::Base::Importer
14
14
  include Merb::Global::MessageProviders::Base::Exporter
15
15
 
16
- def localize(singular, plural, opts)
16
+ def localize(singular, plural, n, locale)
17
17
  language = Language.find :first,
18
- :conditions => {:name => opts[:lang]}
18
+ :conditions => {:name => locale.to_s}
19
19
  unless language.nil?
20
20
  unless plural.nil?
21
- n = Plural.which_form opts[:n], language.plural
22
- translation = Translation.find [language.id, singular, n]
21
+ pn = Plural.which_form n, language.plural
22
+ translation = Translation.find [language.id, singular, pn]
23
23
  else
24
24
  # Bug of composite_primary_keys?
25
25
  conditions = {
@@ -31,11 +31,11 @@ module Merb
31
31
  end
32
32
  return translation.msgstr
33
33
  end rescue nil
34
- return opts[:n] > 1 ? plural : singular # Fallback if not in database
34
+ return n > 1 ? plural : singular # Fallback if not in database
35
35
  end
36
36
 
37
37
  def support?(lang)
38
- Language.count(:conditions => {:name => lang}) != 0
38
+ Language.count(:conditions => {:name => lang.to_s}) != 0
39
39
  end
40
40
 
41
41
  def create!
@@ -54,6 +54,7 @@ module Merb
54
54
  if except.empty?
55
55
  Language.find(:first).name
56
56
  else
57
+ except = except.collect {|locale| locale.to_s}
57
58
  condition = 'name NOT IN (' + '?, ' * (except.length - 1) + '?)'
58
59
  Language.find(:first, :conditions => [condition, *except]).name
59
60
  end
@@ -10,15 +10,15 @@ module Merb
10
10
  include Merb::Global::MessageProviders::Base::Importer
11
11
  include Merb::Global::MessageProviders::Base::Exporter
12
12
 
13
- def localize(singular, plural, opts)
13
+ def localize(singular, plural, n, locale)
14
14
  # I hope it's from MemCache
15
- language = Language.first :name => opts[:lang]
15
+ language = Language.first :name => locale.to_s
16
16
  unless language.nil?
17
17
  unless plural.nil?
18
- n = Plural.which_form opts[:n], language.plural
18
+ pn = Plural.which_form n, language.plural
19
19
  translation = Translation.first :language_id => language.id,
20
20
  :msgid => singular,
21
- :msgstr_index => n
21
+ :msgstr_index => pn
22
22
  else
23
23
  translation = Translation.first :language_id => language.id,
24
24
  :msgid => singular,
@@ -27,11 +27,11 @@ module Merb
27
27
  return translation.msgstr unless translation.nil?
28
28
  end
29
29
  # Fallback if not in database
30
- return opts[:n] != 1 ? plural : singular
30
+ return n != 1 ? plural : singular
31
31
  end
32
32
 
33
33
  def support?(lang)
34
- not Language.first(:name => lang).nil?
34
+ not Language.first(:name => lang.to_s).nil?
35
35
  end
36
36
 
37
37
  def create!
@@ -40,6 +40,7 @@ module Merb
40
40
  end
41
41
 
42
42
  def choose(except)
43
+ except = except.collect {|locale| except.to_s}
43
44
  Language.first(:name.not => except).name
44
45
  end
45
46
 
@@ -2,11 +2,9 @@ require 'gettext'
2
2
  require 'treetop'
3
3
  require 'pathname'
4
4
 
5
- # I'm not sure if it is the correct way of doing it.
6
- # As far it seems to be simpler.
7
- class Thread #:nodoc:
8
- def gettext_context
9
- @gettext_context ||= Merb::Global::MessageProviders::Gettext::GettextContext.new
5
+ class Merb::Global::Locale #:nodoc:
6
+ def _mg_gettext
7
+ @mg_gettext ||= Merb::Global::MessageProviders::Gettext::GettextContext.new
10
8
  end
11
9
  end
12
10
 
@@ -18,17 +16,18 @@ module Merb
18
16
  include Merb::Global::MessageProviders::Base::Importer
19
17
  include Merb::Global::MessageProviders::Base::Exporter
20
18
 
21
- def localize(singular, plural, opts)
22
- context = Thread.current.gettext_context
23
- context.set_locale opts[:lang], true
19
+ def localize(singular, plural, n, locale)
20
+ context = locale._mg_gettext
21
+ context.set_locale locale.to_s, true
24
22
  unless plural.nil?
25
- context.ngettext singular, plural, opts[:n]
23
+ context.ngettext singular, plural, n
26
24
  else
27
25
  context.gettext singular
28
26
  end
29
27
  end
30
28
 
31
29
  def support?(lang)
30
+ lang = lang.to_s
32
31
  lang == 'en' ||
33
32
  File.exist?(File.join(Merb::Global::MessageProviders.localedir, lang))
34
33
  end
@@ -38,6 +37,7 @@ module Merb
38
37
  end
39
38
 
40
39
  def choose(except)
40
+ except = except.collect {|locale| locale.to_s}
41
41
  dir = Dir[Merb::Global::MessageProviders.localedir + '/*/']
42
42
  dir.collect! {|p| File.basename p}
43
43
  dir << 'en'
@@ -4,8 +4,8 @@ module Merb
4
4
  class Mock #:nodoc:
5
5
  include Merb::Global::MessageProviders::Base
6
6
 
7
- def localize(singular, plural, opts)
8
- opts[:n] > 1 ? plural : singular
7
+ def localize(singular, plural, n, locale)
8
+ n > 1 ? plural : singular
9
9
  end
10
10
 
11
11
  def support?(lang)
@@ -16,7 +16,7 @@ module Merb
16
16
  nil # It's mock after all ;)
17
17
  end
18
18
 
19
- def choose
19
+ def choose(except)
20
20
  'en'
21
21
  end
22
22
  end
@@ -9,22 +9,23 @@ module Merb
9
9
  include Merb::Global::MessageProviders::Base::Importer
10
10
  include Merb::Global::MessageProviders::Base::Exporter
11
11
 
12
- def localize(singular, plural, opts)
13
- language = Language[:name => opts[:lang]] # I hope it's from MemCache
12
+ def localize(singular, plural, n, locale)
13
+ # I hope it's from MemCache
14
+ language = Language[:name => locale.to_s]
14
15
  unless language.nil?
15
16
  unless plural.nil?
16
- n = Plural.which_form opts[:n], language[:plural]
17
- translation = Translation[language.pk, singular, n]
17
+ pn = Plural.which_form n, language[:plural]
18
+ translation = Translation[language.pk, singular, pn]
18
19
  else
19
20
  translation = Translation[language.pk, singular, nil]
20
21
  end
21
22
  return translation[:msgstr] unless translation.nil?
22
23
  end
23
- return opts[:n] > 1 ? plural : singular # Fallback if not in database
24
+ return n > 1 ? plural : singular # Fallback if not in database
24
25
  end
25
26
 
26
27
  def support?(lang)
27
- Language.filter(:name => lang).count != 0
28
+ Language.filter(:name => lang.to_s).count != 0
28
29
  end
29
30
 
30
31
  def create!
@@ -43,6 +44,7 @@ module Merb
43
44
  if except.empty?
44
45
  Language.first[:name]
45
46
  else
47
+ except = except.collect {|locale| locale.to_s}
46
48
  Language.filter(~{:name => except}).first[:name]
47
49
  end
48
50
  end
@@ -16,41 +16,42 @@ module Merb
16
16
  @lang = Hash.new
17
17
  end
18
18
 
19
- def localize(singular, plural, opts)
19
+ def localize(singular, plural, n, locale)
20
20
  unless Merb.environment == "development"
21
21
  lang = @lang
22
22
  else
23
23
  lang = {}
24
24
  end
25
25
 
26
- unless lang.include? opts[:lang]
26
+ unless lang.include? locale
27
27
  file = File.join Merb::Global::MessageProviders.localedir,
28
- opts[:lang] + '.yaml'
28
+ locale.to_s + '.yaml'
29
29
  if File.exist? file
30
- lang[opts[:lang]] = YAML.load_file file
30
+ lang[locale] = YAML.load_file file
31
31
  else
32
- lang[opts[:lang]] = nil
32
+ # TODO: Check if it not opens security risk
33
+ lang[locale] = nil
33
34
  end
34
35
  end
35
36
 
36
- unless lang[opts[:lang]].nil?
37
- lang = lang[opts[:lang]]
37
+ unless lang[locale].nil?
38
+ lang = lang[locale]
38
39
  unless lang[singular].nil?
39
40
  unless plural.nil?
40
- n = Merb::Global::Plural.which_form opts[:n], lang[:plural]
41
+ n = Merb::Global::Plural.which_form n, lang[:plural]
41
42
  return lang[singular][n] unless lang[singular][n].nil?
42
43
  else
43
44
  return lang[singular] unless lang[singular].nil?
44
45
  end
45
46
  end
46
47
  end
47
- return opts[:n] > 1 ? plural : singular
48
+ return n > 1 ? plural : singular
48
49
  end
49
50
 
50
51
  def support?(lang)
51
52
  unless @lang.include? lang
52
53
  file = File.join Merb::Global::MessageProviders.localedir,
53
- lang + '.yaml'
54
+ lang.to_s + '.yaml'
54
55
  @lang[lang] = YAML.load_file file if File.exist? file
55
56
  end
56
57
  not @lang[lang].nil?
@@ -61,6 +62,7 @@ module Merb
61
62
  end
62
63
 
63
64
  def choose(except)
65
+ except = except.collect {|locale| locale.to_s}
64
66
  dir = Dir[Merb::Global::MessageProviders.localedir + '/*.yaml']
65
67
  dir.collect! {|p| File.basename p, '.yaml'}
66
68
  dir.reject! {|lang| except.include? lang}
@@ -50,18 +50,15 @@ module Merb
50
50
  # ==== Parameters
51
51
  # singular<String>:: A string to translate
52
52
  # plural<String>:: A plural form of string (nil if only singular)
53
- # opts<Hash>:: An options hash (see below)
54
- #
55
- # ==== Options (opts)
56
- # :lang<String>:: A language to translate on
57
- # :n<Fixnum>:: A number of objects
53
+ # n<Fixnum>:: A number of objects
54
+ # locale<Locale>:: A locale to which translate
58
55
  #
59
56
  # ==== Returns
60
57
  # translated<String>:: A translated string
61
58
  #
62
59
  # ==== Raises
63
60
  # NoMethodError:: Raised by default implementation. Should not be thrown.
64
- def localize(singular, plural, opts)
61
+ def localize(singular, plural, n, locale)
65
62
  raise NoMethodError.new 'method localize has not been implemented'
66
63
  end
67
64
  # call-seq:
@@ -10,7 +10,7 @@ module Merb
10
10
  pipe_rd, pipe_wr = IO.pipe
11
11
  pid = fork do
12
12
  pipe_rd.close
13
- setlocale(lang)
13
+ setlocale(lang.to_s)
14
14
  pipe_wr.write(number)
15
15
  pipe_wr.flush
16
16
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: merb_global
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5.2
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Coles
@@ -10,7 +10,7 @@ autorequire: merb_global
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2008-10-31 00:00:00 +01:00
13
+ date: 2008-11-06 00:00:00 +01:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -68,6 +68,7 @@ files:
68
68
  - lib/merb_global/date_providers
69
69
  - lib/merb_global/date_providers/fork.rb
70
70
  - lib/merb_global/controller.rb
71
+ - lib/merb_global/locale.rb
71
72
  - lib/merb_global/base.rb
72
73
  - lib/merb_global/numeric_providers
73
74
  - lib/merb_global/numeric_providers/fork.rb