rutils 0.2.4 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,13 @@
1
+ === 0.2.5 - 08.08.2008
2
+ * Поддержка Rails Edge (pre-2.2) для хелперов DateTime. RuTils при overrides_enabled пытается поставить себя выше I18n -- при overrides_enabled I18n не вызывается для datetime хелперов. (Yaroslav Markin)
3
+ * Частичная поддержка RedCloth 4 (julik)
4
+ * Фильтр для контроллера чтобы установить верный флаг для экшена, то что происходит в экшене - thread local (julik)
5
+ * Разделяем тесты и хаки (julik)
6
+ * Добавлена поддержка strftime макроса %e (номер дня в месяце без лидирующего нуля) -- по аналогии с %d, при использовании %e мы склоняем имя месяца (Yaroslav Markin)
7
+ * Использование с RedCloth 4 больше не вызывает ошибки (совместимости для перегрузки все еще нет) (Yaroslav Markin)
8
+ * Добавлен метод Fixnum#kopeek для вывода целочисленных Денег (julik)
9
+ * RuTils::overrides безопасен для нитей (julik)
10
+
1
11
  === 0.2.4 - 10.07.2008
2
12
 
3
13
  * Форматтер даты-времени должен гарантированно возвращать результат (Eugene Pimenov + julik)
@@ -12,7 +22,7 @@
12
22
  * Переписаны Date хелперы для Rails. Теперь поддерживаются все опции Rails 1.2--2.0 и
13
23
  Rails 2.1+ (Yaroslav Markin)
14
24
  * Переписаны и дополнены тесты на перегрузку Date хелперов Rails (Yaroslav Markin)
15
- * Для тестирования оверрайдов Rails используется gem multi_rail10s
25
+ * Для тестирования оверрайдов Rails используется gem multi_rails
16
26
  * До свидания, <nobr>. Указывайте .nobr { text-wrap: nowrap } в своих стилевых таблицах.
17
27
 
18
28
  === 0.2.3 - 27.09.2007
data/Manifest.txt CHANGED
@@ -12,7 +12,10 @@ lib/gilenson/gilenson.rb
12
12
  lib/integration/blue_cloth_override.rb
13
13
  lib/integration/integration.rb
14
14
  lib/integration/rails_date_helper_override.rb
15
+ lib/integration/rails_pre_filter.rb
16
+ lib/integration/red_cloth_four.rb
15
17
  lib/integration/red_cloth_override.rb
18
+ lib/integration/red_cloth_three.rb
16
19
  lib/pluralizer/pluralizer.rb
17
20
  lib/rutils.rb
18
21
  lib/transliteration/bidi.rb
@@ -25,3 +28,8 @@ test/t_integration.rb
25
28
  test/t_pluralize.rb
26
29
  test/t_rutils_base.rb
27
30
  test/t_transliteration.rb
31
+ test/test_integration_bluecloth.rb
32
+ test/test_integration_redcloth3.rb
33
+ test/test_integration_redcloth4.rb
34
+ test/test_rails_filter.rb
35
+ test/test_rails_helpers.rb
data/README.txt CHANGED
@@ -6,11 +6,11 @@ RuTils - простой обработчик русского текста на
6
6
 
7
7
  == Чье это
8
8
 
9
+ Разработчики RuTils - Julik[http://julik.nl], Mash[http://imfo.ru], {Yaroslav Markin}[http://markin.net/]
10
+
9
11
  Большое спасибо Роману Иванову aka Kukutz и Николаю Яремко aka Kuso Mendokuzee за
10
12
  реализацию большинства алгоритмов на PHP.
11
13
 
12
- Разработчики RuTils - Julik[http://julik.nl], Mash[http://imfo.ru], {Yaroslav Markin}[http://markin.net/]
13
-
14
14
  = Как воспользоваться
15
15
 
16
16
  Просто включите rutils в свою программу как библиотеку
@@ -44,6 +44,11 @@ RuTils реализует сумму прописью для целых и др
44
44
  1.rubl => "один рубль"
45
45
  22.rublja => "двадцать два рубля"
46
46
 
47
+ Если вы храните денежные единицы в целочисленных типах, пользуйтесь "копеечными" вариантами:
48
+
49
+ 300.kopeek => "три рубля"
50
+ 121.kopeika => "один рубль двадцать одна копейка"
51
+
47
52
  == Транслит
48
53
 
49
54
  RuTils на данный момент реализует простейший транслит "в одну сторону" и
@@ -108,7 +113,7 @@ Unicode-тексты в среде UNIX пользуясь стандартны
108
113
  Пример использования:
109
114
 
110
115
  require 'date' date = Date.new(2005, 11, 9)
111
- puts "#{Date::RU_ABBR_MONTHNAMES[date.mon]}" => Ноя puts
116
+ puts "#{Date::RU_ABBR_MONTHNAMES[date.mon]}" => Ноя
112
117
  puts "#{Date::RU_MONTHNAMES[date.mon]}" => Ноябрь
113
118
  puts "#{Date::RU_ABBR_DAYNAMES[date.wday]}" => Ср
114
119
  puts "#{Date::RU_DAYNAMES[date.wday]}" => Среда
data/Rakefile.rb CHANGED
@@ -1,8 +1,11 @@
1
1
  $KCODE = 'u'
2
+ $:.reject! { |e| e.include? 'TextMate' }
2
3
 
3
4
  require 'lib/rutils'
4
5
  require 'rubygems'
5
6
 
7
+
8
+
6
9
  begin
7
10
  require 'hoe'
8
11
 
@@ -10,6 +13,13 @@ begin
10
13
  Hoe::RUBY_FLAGS.replace ENV['RUBY_FLAGS'] || "-I#{%w(lib test).join(File::PATH_SEPARATOR)}" +
11
14
  (Hoe::RUBY_DEBUG ? " #{RUBY_DEBUG}" : '')
12
15
 
16
+ # The generic URI syntax mandates that new URI schemes that provide for the
17
+ # representation of character data in a URI must, in effect, represent characters from
18
+ # the unreserved set without translation, and should convert all other characters to
19
+ # bytes according to UTF-8, # and then percent-encode those values. This requirement was
20
+ # introduced in January 2005 with the publication of RFC 3986. URI schemes # introduced
21
+ # before this date are not affected.
22
+
13
23
  # Hoe minus dependency pollution plus unidocs plus rdoc fix. Kommunizm, perestroika.
14
24
  class KolkHoe < Hoe
15
25
  DOCOPTS = %w(--webcvs=http://rutils.rubyforge.org/svn/trunk/%s --charset=utf-8 --promiscuous)
@@ -32,6 +42,7 @@ begin
32
42
  p.summary = 'Simple processing of russian strings'
33
43
  p.url = "http://rutils.rubyforge.org"
34
44
  p.test_globs = 'test/t_*.rb'
45
+ p.remote_rdoc_dir = ''
35
46
  p.need_zip = true
36
47
  p.remote_rdoc_dir = ''
37
48
  end
data/TODO.txt CHANGED
@@ -1,8 +1,7 @@
1
1
  =TODO
2
2
 
3
- ==Pluralization
4
-
5
- * Истинная плюрализация без передачи рода и вариантов (как в Rails)
6
-
7
3
  ==Rails
8
4
 
5
+ * i18n was merged into Rails trunk (http://github.com/svenfuchs/i18n/tree/master), (http://github.com/svenfuchs/rails/tree/i18n-merge), нужно
6
+ написать i18n файлы для common stuff (datetime) и Rails.
7
+
data/init.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  =begin
2
- Этот файл - заглушка для Rails-плагина. Если поместить rutils в папку vendor/plugins RuTils будет
3
- автоматически вгружен в ваше Rails-приложение
2
+ Этот файл - заглушка для Rails-плагина.
3
+ Если поместить rutils/ в папку vendor/plugins/ вашего Rails-приложения,
4
+ RuTils будет автоматически загружен с включенным флагом <tt>RuTils::overrides = true</tt>.
5
+ В ActionController::Base будет установлен пре-фильтр устанавливающий флаг <tt>overrides.</tt>
4
6
  =end
5
7
  require File.join(File.dirname(__FILE__), 'lib', 'rutils')
6
- RuTils::overrides = true
8
+ RuTils::overrides = true
9
+ require File.dirname(__FILE__) + '/lib/integration/rails_pre_filter'
@@ -3,7 +3,7 @@ module RuTils
3
3
 
4
4
  def self.distance_of_time_in_words(from_time, to_time = 0, include_seconds = false, absolute = false) #nodoc
5
5
  from_time = from_time.to_time if from_time.respond_to?(:to_time)
6
- to_time = to_time.to_time if to_time.respond_to?(:to_time)
6
+ to_time = to_time.to_time if to_time.respond_to?(:to_time)
7
7
  distance_in_minutes = (((to_time - from_time).abs)/60).round
8
8
  distance_in_seconds = ((to_time - from_time).abs).round
9
9
 
@@ -13,14 +13,14 @@ module RuTils
13
13
 
14
14
  case distance_in_seconds
15
15
  when 0..5 then 'менее 5 секунд'
16
- when 6..10 then 'менее 10 секунд'
16
+ when 6..10 then 'менее 10 секунд'
17
17
  when 11..20 then 'менее 20 секунд'
18
18
  when 21..40 then 'пол-минуты'
19
19
  when 41..59 then 'меньше минуты'
20
- else '1 минуту'
20
+ else '1 минуту'
21
21
  end
22
22
 
23
- when 2..45 then distance_in_minutes.to_s +
23
+ when 2..45 then distance_in_minutes.to_s +
24
24
  " " + distance_in_minutes.items("минута", "минуты", "минут")
25
25
  when 46..90 then 'около часа'
26
26
  # исключение, сдвигаем на один влево чтобы соответствовать падежу
@@ -33,11 +33,12 @@ module RuTils
33
33
  end
34
34
 
35
35
  def self.ru_strftime(time, format_str='%d.%m.%Y')
36
- clean_fmt = format_str.gsub(/%{2}/, RuTils::SUBSTITUTION_MARKER).
36
+ clean_fmt = format_str.to_s.gsub(/%{2}/, RuTils::SUBSTITUTION_MARKER).
37
37
  gsub(/%a/, Date::RU_ABBR_DAYNAMES[time.wday]).
38
38
  gsub(/%A/, Date::RU_DAYNAMES[time.wday]).
39
39
  gsub(/%b/, Date::RU_ABBR_MONTHNAMES[time.mon]).
40
40
  gsub(/%d(\s)*%B/, '%02d' % time.day + '\1' + Date::RU_INFLECTED_MONTHNAMES[time.mon]).
41
+ gsub(/%e(\s)*%B/, '%d' % time.day + '\1' + Date::RU_INFLECTED_MONTHNAMES[time.mon]).
41
42
  gsub(/%B/, Date::RU_MONTHNAMES[time.mon]).
42
43
  gsub(/#{RuTils::SUBSTITUTION_MARKER}/, '%%')
43
44
 
@@ -53,7 +54,6 @@ class Date
53
54
  RU_ABBR_MONTHNAMES = [nil] + %w{ янв фев мар апр май июн июл авг сен окт ноя дек }
54
55
  RU_ABBR_DAYNAMES = %w(вск пн вт ср чт пт сб)
55
56
  RU_INFLECTED_MONTHNAMES = [nil] + %w{ января февраля марта апреля мая июня июля августа сентября октября ноября декабря }
56
- # RU_DAYNAMES_E -- оставить?
57
57
  RU_DAYNAMES_E = [nil] + %w{первое второе третье четвёртое пятое шестое седьмое восьмое девятое десятое одиннадцатое двенадцатое тринадцатое четырнадцатое пятнадцатое шестнадцатое семнадцатое восемнадцатое девятнадцатое двадцатое двадцать тридцатое тридцатьпервое}
58
58
  end
59
59
 
@@ -66,7 +66,6 @@ class Time
66
66
  end
67
67
 
68
68
  class Date
69
-
70
69
  # Inside rails we have date formatting
71
70
  if self.instance_methods.include?('strftime')
72
71
  alias_method :strftime_norutils, :strftime
@@ -1,25 +1,4 @@
1
1
  module RuTils
2
- @@overrides = true
3
-
4
- # Метод позволяет проверить, включена ли перегрузка функций других модулей.
5
- # Попутно он спрашивает модуль Locale (если таковой имеется) является ли русский
6
- # текущим языком, и если является, включает перегрузку функций имплицитно.
7
- # Это позволяет подчинить настройку перегруженных функций настроенной локали.
8
- # Модуль Locale можно получить как часть Ruby-Gettext или как отдельный
9
- # модуль ruby-locale. Мы поддерживаем оба.
10
- def self.overrides_enabled?
11
- if defined?(Locale) and Locale.respond_to?(:current)
12
- return true if Locale.current.to_s.split('_').first == 'ru'
13
- end
14
- @@overrides ? true : false
15
- end
16
-
17
- # Включает или выключает перегрузки других модулей. Полезно, например, в случае когда нужно рендерить страницу
18
- # сайта на нескольких языках и нужно отключить русское оформление текста для других языков.
19
- def self.overrides= (new_override_flag)
20
- @@overrides = (new_override_flag ? true : false)
21
- end
22
-
23
2
  # Вновь выполняет перегрузку. Делать это надо после того, как в программу импортированы
24
3
  # другие модули.
25
4
  def self.reload_integrations!
@@ -13,6 +13,13 @@ if defined?(Object::ActionView)
13
13
  def current; now; end
14
14
  end
15
15
  end
16
+
17
+ # В Rails Edge (2.1+) определяется <tt>Date.current</tt> для работы с временными зонами.
18
+ unless Date.respond_to? :current
19
+ class << ::Date # :nodoc:
20
+ def current; now; end
21
+ end
22
+ end
16
23
 
17
24
  # Заменяет <tt>ActionView::Helpers::DateHelper::distance_of_time_in_words</tt> на русское сообщение.
18
25
  #
@@ -29,9 +36,15 @@ if defined?(Object::ActionView)
29
36
  # select_month(Date.today, :use_month_numbers => true) # Использует ключи "1", "3"
30
37
  # select_month(Date.today, :add_month_numbers => true) # Использует ключи "1 - Январь", "3 - Март"
31
38
  def select_month(date, options = {}, html_options = {})
39
+ locale = options[:locale] unless RuTils::overrides_enabled?
40
+
32
41
  val = date ? (date.kind_of?(Fixnum) ? date : date.month) : ''
33
42
  if options[:use_hidden]
34
- hidden_html(options[:field_name] || 'month', val, options)
43
+ if self.class.private_instance_methods.include? "_date_hidden_html"
44
+ _date_hidden_html(options[:field_name] || 'month', val, options)
45
+ else
46
+ hidden_html(options[:field_name] || 'month', val, options)
47
+ end
35
48
  else
36
49
  month_options = []
37
50
  if RuTils::overrides_enabled?
@@ -45,9 +58,17 @@ if defined?(Object::ActionView)
45
58
  Date::RU_MONTHNAMES
46
59
  end
47
60
  else
48
- month_names = options[:use_short_month] ? Date::ABBR_MONTHNAMES : Date::MONTHNAMES
61
+ if defined? I18n
62
+ month_names = options[:use_month_names] || begin
63
+ key = options[:use_short_month] ? :'date.abbr_month_names' : :'date.month_names'
64
+ I18n.translate key, :locale => locale
65
+ end
66
+ else
67
+ month_names = options[:use_short_month] ? Date::ABBR_MONTHNAMES : Date::MONTHNAMES
68
+ end
49
69
  end
50
70
  month_names.unshift(nil) if month_names.size < 13
71
+
51
72
  1.upto(12) do |month_number|
52
73
  month_name = if options[:use_month_numbers]
53
74
  month_number
@@ -63,8 +84,13 @@ if defined?(Object::ActionView)
63
84
  )
64
85
  month_options << "\n"
65
86
  end
87
+
66
88
  if DATE_HELPERS_RECEIVE_HTML_OPTIONS
67
- select_html(options[:field_name] || 'month', month_options.join, options, html_options)
89
+ if self.class.private_instance_methods.include? "_date_select_html"
90
+ _date_select_html(options[:field_name] || 'month', month_options.join, options, html_options)
91
+ else
92
+ select_html(options[:field_name] || 'month', month_options.join, options, html_options)
93
+ end
68
94
  else
69
95
  select_html(options[:field_name] || 'month', month_options.join, options)
70
96
  end
@@ -73,7 +99,7 @@ if defined?(Object::ActionView)
73
99
 
74
100
  alias :stock_select_date :select_date
75
101
  # Заменяет ActionView::Helpers::DateHelper::select_date меню выбора русской даты.
76
- def select_date(date = Date.today, options = {}, html_options = {})
102
+ def select_date(date = Date.current, options = {}, html_options = {})
77
103
  options[:order] ||= [:day, :month, :year]
78
104
  if DATE_HELPERS_RECEIVE_HTML_OPTIONS
79
105
  stock_select_date(date, options, html_options)
@@ -0,0 +1,3 @@
1
+ class ActionController::Base
2
+ before_filter { RuTils::overrides = true }
3
+ end
@@ -0,0 +1,24 @@
1
+ # RedCloth 4
2
+ class RedCloth::TextileDoc < String
3
+ alias_method :to_html_without_rutils, :to_html
4
+
5
+ def to_html
6
+ if RuTils::overrides_enabled?
7
+ suspended = to_html_without_rutils
8
+
9
+ # Return quotes to original state
10
+ [187, 171, 8220, 8221].map do |e|
11
+ suspended.gsub! /&\##{e};/, '"'
12
+ end
13
+
14
+ # Return spaces to original state
15
+ [160].map do |e|
16
+ suspended.gsub! /&\##{e};/, ' '
17
+ end
18
+
19
+ suspended.gilensize
20
+ else
21
+ to_html_without_rutils
22
+ end
23
+ end
24
+ end
@@ -1,27 +1,7 @@
1
1
  if defined?(Object::RedCloth) && !RedCloth.instance_methods.include?(:htmlesc_without_rutils)
2
- # RuTils выполняет перегрузку Textile Glyphs в RedCloth, перенося форматирование спецсимволов на Gilenson.
3
- class RedCloth < String #:nodoc:
4
-
5
- # Этот метод в RedCloth при наличии Гиленсона надо отключать
6
- alias_method :htmlesc_without_rutils, :htmlesc
7
- def htmlesc(text, mode=0) #:nodoc:
8
- RuTils::overrides_enabled? ? text : htmlesc_without_rutils(text, mode)
9
- end
10
-
11
- # А этот метод обрабатывает Textile Glyphs - ту самую типографицу.
12
- # Вместо того чтобы влезать в чужие таблицы мы просто заменим Textile Glyphs на Gilenson - и все будут рады.
13
- alias_method :pgl_without_rutils, :pgl
14
- def pgl(text) #:nodoc:
15
- if RuTils::overrides_enabled?
16
- # Suspend the spaces in the start and end of the block because Gilenson chews them off, and RedCloth feeds them to us in packs
17
- # that appear between tag starts/stops. We mess up the formatting but preserve the spacing.
18
- spaces = Array.new(2,'')
19
- text.gsub!(/\A([\s]+)/) { spaces[0] = $1; '' }
20
- text.gsub!(/(\s+)\Z/) { spaces[1] = $1; '' }
21
- text.replace(spaces[0].to_s + RuTils::Gilenson::Formatter.new(text).to_html + spaces[1].to_s)
22
- else
23
- pgl_without_rutils(text)
24
- end
25
- end
2
+ if RedCloth.class == Module
3
+ require File.dirname(__FILE__) + '/red_cloth_four'
4
+ else
5
+ require File.dirname(__FILE__) + '/red_cloth_three'
26
6
  end
27
7
  end
@@ -0,0 +1,25 @@
1
+ # RuTils выполняет перегрузку Textile Glyphs в RedCloth, перенося форматирование спецсимволов на Gilenson.
2
+ class RedCloth < String #:nodoc:
3
+ # Этот метод в RedCloth при наличии Гиленсона надо отключать
4
+ alias_method :htmlesc_without_rutils, :htmlesc
5
+ def htmlesc(text, mode=0) #:nodoc:
6
+ RuTils::overrides_enabled? ? text : htmlesc_without_rutils(text, mode)
7
+ end
8
+
9
+ # А этот метод обрабатывает Textile Glyphs - ту самую типографицу.
10
+ # Вместо того чтобы влезать в чужие таблицы мы просто заменим Textile Glyphs на Gilenson - и все будут рады.
11
+ alias_method :pgl_without_rutils, :pgl
12
+ def pgl(text) #:nodoc:
13
+ if RuTils::overrides_enabled?
14
+ # Suspend the spaces in the start and end of the block because Gilenson chews them off,
15
+ # and RedCloth feeds them to us in packs
16
+ # that appear between tag starts/stops. We mess up the formatting but preserve the spacing.
17
+ spaces = Array.new(2,'')
18
+ text.gsub!(/\A([\s]+)/) { spaces[0] = $1; '' }
19
+ text.gsub!(/(\s+)\Z/) { spaces[1] = $1; '' }
20
+ text.replace(spaces[0].to_s + RuTils::Gilenson::Formatter.new(text).to_html + spaces[1].to_s)
21
+ else
22
+ pgl_without_rutils(text)
23
+ end
24
+ end
25
+ end
@@ -5,7 +5,8 @@ module RuTils
5
5
  variant = (amount%10==1 && amount%100!=11 ? 1 : amount%10>=2 && amount%10<=4 && (amount%100<10 || amount%100>=20) ? 2 : 3)
6
6
  variants[variant-1]
7
7
  end
8
-
8
+
9
+ # Выводит целое или дробное число как сумму в рублях прописью
9
10
  def self.rublej(amount)
10
11
  pts = []
11
12
 
@@ -22,6 +23,14 @@ module RuTils
22
23
  pts.join(' ')
23
24
  end
24
25
 
26
+ def self.kopeek(amount)
27
+ pts = []
28
+ r, k = (amount/100.0).floor, (amount - ((amount/100.0).floor * 100)).to_i
29
+ pts << RuTils::Pluralization::sum_string(r, 1, "рубль", "рубля", "рублей") unless r.zero?
30
+ pts << RuTils::Pluralization::sum_string(k, 2, 'копейка', 'копейки', 'копеек') unless k.zero?
31
+ pts.join(' ')
32
+ end
33
+
25
34
  # Выполняет преобразование числа из цифрого вида в символьное
26
35
  # amount - числительное
27
36
  # gender = 1 - мужской, = 2 - женский, = 3 - средний
@@ -130,9 +139,9 @@ module RuTils
130
139
  end
131
140
  end_word = two_items
132
141
  when 3
133
- ones = "три " if end_word = two_items
142
+ ones = "три " if end_word = two_items # TODO - WTF?
134
143
  when 4
135
- ones = "четыре " if end_word = two_items
144
+ ones = "четыре " if end_word = two_items # TODO - WTF?
136
145
  when 5
137
146
  ones = "пять "
138
147
  when 6
@@ -227,6 +236,14 @@ module RuTils
227
236
  alias :rubl :rublej
228
237
  alias :rublja :rublej
229
238
  end
239
+
240
+ module FixnumFormatting
241
+ def kopeek
242
+ RuTils::Pluralization.kopeek(self)
243
+ end
244
+ alias :kopeika :kopeek
245
+ alias :kopeiki :kopeek
246
+ end
230
247
  end
231
248
  end
232
249
 
@@ -234,6 +251,9 @@ class Object::Numeric
234
251
  include RuTils::Pluralization::NumericFormatting
235
252
  end
236
253
 
254
+ class Object::Fixnum
255
+ include RuTils::Pluralization::FixnumFormatting
256
+ end
237
257
 
238
258
  class Object::Float
239
259
  include RuTils::Pluralization::FloatFormatting
data/lib/rutils.rb CHANGED
@@ -8,7 +8,7 @@ module RuTils
8
8
  INSTALLATION_DIRECTORY = File.expand_path(File.dirname(__FILE__) + '/../') #:nodoc:
9
9
  MAJOR = 0 #:nodoc:
10
10
  MINOR = 2 #:nodoc:
11
- TINY = 4 #:nodoc:
11
+ TINY = 5 #:nodoc:
12
12
 
13
13
  # Стандартный маркер для подстановок - invalid UTF sequence
14
14
  SUBSTITUTION_MARKER = "\xF0\xF0\xF0\xF0" #:nodoc:
@@ -18,6 +18,33 @@ module RuTils
18
18
  # Версия RuTils
19
19
  VERSION = [MAJOR, MINOR ,TINY].join('.')
20
20
 
21
+ @@overrides = true
22
+
23
+ # Метод позволяет проверить, включена ли перегрузка функций других модулей.
24
+ # Попутно он спрашивает модуль Locale (если таковой имеется) является ли русский
25
+ # текущим языком, и если является, включает перегрузку функций имплицитно.
26
+ # Это позволяет подчинить настройку перегруженных функций настроенной локали.
27
+ # Модуль Locale можно получить как часть Ruby-Gettext или как отдельный
28
+ # модуль ruby-locale. Мы поддерживаем оба.
29
+ def overrides_enabled?
30
+ if defined?(Locale) and Locale.respond_to?(:current)
31
+ return true if Locale.current.to_s.split('_').first == 'ru'
32
+ end
33
+ thread_local_or_own_flag ? true : false
34
+ end
35
+ alias_method :overrides, :overrides_enabled?
36
+ module_function :overrides_enabled?
37
+
38
+ # Включает или выключает перегрузки других модулей. Полезно, например, в случае когда нужно рендерить страницу
39
+ # сайта на нескольких языках и нужно отключить русское оформление текста для других языков.
40
+ def overrides=(new_override_flag)
41
+ Thread.current[:rutils_overrided_enabled] = (new_override_flag ? true : false)
42
+ end
43
+ module_function :overrides=
44
+
45
+ def self.thread_local_or_own_flag
46
+ Thread.current.keys.include?(:rutils_overrided_enabled) ? Thread.current[:rutils_overrided_enabled] : false
47
+ end
21
48
 
22
49
  def self.load_component(name) #:nodoc:
23
50
  require File.join(RuTils::INSTALLATION_DIRECTORY, "lib", name.to_s, name.to_s)
data/test/t_datetime.rb CHANGED
@@ -4,54 +4,143 @@ require File.dirname(__FILE__) + '/../lib/rutils'
4
4
 
5
5
  class DistanceOfTimeTest < Test::Unit::TestCase
6
6
  def test_distance_of_time_in_words
7
- assert_equal "меньше минуты", RuTils::DateTime::distance_of_time_in_words(0, 50)
8
- assert_equal "2 минуты", RuTils::DateTime::distance_of_time_in_words(0, 140)
9
- assert_equal "около 2 часов", RuTils::DateTime::distance_of_time_in_words(0, 60*114)
10
- assert_equal "около 3 часов", RuTils::DateTime::distance_of_time_in_words(0, 60*120+60*60)
11
- assert_equal "около 5 часов", RuTils::DateTime.distance_of_time_in_words(60*60*5)
7
+ assert_format_eq "меньше минуты", 0, 50
8
+ assert_format_eq "2 минуты", 0, 140
9
+ assert_format_eq "около 2 часов", 0, 60*114
10
+ assert_format_eq "около 3 часов", 0, 60*120+60*60
11
+ assert_format_eq "около 5 часов", 60*60*5
12
+ end
13
+
14
+ def assert_format_eq(str, *from_and_distance)
15
+ assert_equal str, RuTils::DateTime.distance_of_time_in_words(*from_and_distance)
12
16
  end
13
17
  end
14
18
 
15
19
  class StrftimeRuTest < Test::Unit::TestCase
16
- def test_should_format_in_russian
17
- @@old_overrides = RuTils::overrides_enabled?
18
-
19
- RuTils::overrides = true
20
- assert_equal "сб, суббота, дек, декабрь", Time.local(2005,"dec",31).strftime("%a, %A, %b, %B")
21
- assert_equal "%a, %A, %b, %B", Time.local(2005,"dec",31).strftime("%%a, %%A, %%b, %%B")
22
- assert_equal "%сб, %суббота, %дек, %декабрь", Time.local(2005,"dec",31).strftime("%%%a, %%%A, %%%b, %%%B")
23
- assert_equal "Сегодня: 31 декабря, суббота, 2005 года", Time.local(2005,"dec",31).strftime("Сегодня: %d %B, %A, %Y года")
24
- assert_equal "Сегодня: ноябрь, 30 число, дождик в четверг, а год у нас - 2006", Time.local(2006,11,30).strftime("Сегодня: %B, %d число, дождик в %A, а год у нас - %Y")
25
- assert_equal "01 декабря", Time.local(1985, "dec", 01).strftime("%d %B")
26
- assert_equal "11 декабря", Time.local(1985, "dec", 11).strftime("%d %B")
27
-
28
- date = Date.new(2005, 12, 31)
29
- assert_equal "дек декабрь сб суббота", "#{Date::RU_ABBR_MONTHNAMES[date.mon]} #{Date::RU_MONTHNAMES[date.mon]} #{Date::RU_ABBR_DAYNAMES[date.wday]} #{Date::RU_DAYNAMES[date.wday]}"
30
- # We do not support strftime on date at this point
31
- # assert_equal "сб, суббота, дек, декабрь", date.strftime("%a, %A, %b, %B")
20
+
21
+ def test_a_formatter_should_actually_return
22
+ the_fmt = "Это случилось %d %B"
23
+ assert_equal "Это случилось 01 декабря", RuTils::DateTime::ru_strftime(Time.local(1985, "dec", 01), the_fmt)
24
+ end
25
+
26
+ def test_should_not_touch_double_marks
27
+ assert_format_eq "%a, %A, %b, %B", Time.local(2005,"dec",31), "%%a, %%A, %%b, %%B",
28
+ "Should reduce double marks to single marks with no substitutions"
29
+ end
30
+
31
+ def test_should_replace_triple_marks
32
+ assert_format_eq "%сб, %суббота, %дек, %декабрь", Time.local(2005,"dec",31), "%%%a, %%%A, %%%b, %%%B",
33
+ "Should reduce triple marks to %formatted"
34
+ end
35
+
36
+ def test_should_replace_shorthands
37
+ assert_format_eq "сб, суббота, дек, декабрь", Time.local(2005,"dec",31), "%a, %A, %b, %B",
38
+ "Should replace shorthands"
39
+ end
40
+
41
+ def test_percent_d
42
+ assert_format_eq "01 декабря", Time.local(1985, "dec", 01), "%d %B",
43
+ "Should format %d with leading zero and replace month"
44
+ assert_format_eq "11 декабря", Time.local(1985, "dec", 11), "%d %B",
45
+ "Should format 11 with leading zero and replace month"
46
+ end
47
+
48
+ def test_percent_e
49
+ assert_format_eq "1 декабря", Time.local(1985, "dec", 01), "%e %B",
50
+ "Should format %e w/o leading zero and replace month"
51
+ assert_format_eq "11 декабря", Time.local(1985, "dec", 11), "%e %B",
52
+ "Should format 11 w/o leading zero and replace month"
53
+ end
54
+
55
+ def test_all_shorthands
56
+ assert_format_eq "Сегодня: 31 декабря, суббота, 2005 года", Time.local(2005,"dec",31),
57
+ "Сегодня: %d %B, %A, %Y года", "Should format with short format string"
58
+ assert_format_eq "Сегодня: ноябрь, 30 число, дождик в четверг, а год у нас - 2006", Time.local(2006,11,30),
59
+ "Сегодня: %B, %d число, дождик в %A, а год у нас - %Y", "Should format with long format string"
60
+ end
61
+
62
+ def test_shorthands_defined
63
+ date = Date.new(2005, 12, 31)
64
+ assert_equal "дек декабрь сб суббота", "#{Date::RU_ABBR_MONTHNAMES[date.mon]} #{Date::RU_MONTHNAMES[date.mon]} #{Date::RU_ABBR_DAYNAMES[date.wday]} #{Date::RU_DAYNAMES[date.wday]}"
32
65
 
33
- RuTils::overrides = false
66
+ date = Date.new(2005, 11, 9)
67
+ assert_equal "Nov November Wed Wednesday", "#{Date::ABBR_MONTHNAMES[date.mon]} #{Date::MONTHNAMES[date.mon]} #{Date::ABBR_DAYNAMES[date.wday]} #{Date::DAYNAMES[date.wday]}"
68
+
69
+ # We do not support strftime on date at this point
70
+ # assert_equal "сб, суббота, дек, декабрь", date.strftime("%a, %A, %b, %B")
71
+ end
72
+
73
+ def test_formatter_should_not_mutate_passed_format_strings
74
+ the_fmt, backup = "Это случилось %d %B", "Это случилось %d %B"
75
+ assert_equal "Это случилось 01 декабря", RuTils::DateTime::ru_strftime(Time.local(1985, "dec", 01), the_fmt)
76
+ assert_equal the_fmt, backup
77
+ end
78
+
79
+ def test_formatter_should_downagrade_format_strings_to_string
80
+ the_fmt, backup = "Это случилось %d %B", "Это случилось %d %B"
81
+ assert_nothing_raised do
82
+ assert_format_eq "Это случилось 01 декабря", Time.local(1985, "dec", 01), the_fmt.to_sym
83
+ end
84
+ end
85
+
86
+ def assert_format_eq(str, time_or_date, fmt, msg = 'Should format as desired')
87
+ r = RuTils::DateTime::ru_strftime(time_or_date, fmt)
88
+ assert_not_nil r, "The formatter should have returned a not-nil value for #{time_or_date} and #{fmt}"
89
+ assert_kind_of String, "The formatter should have returned a String for #{time_or_date} and #{fmt}"
90
+ assert_equal str, r, msg
91
+ end
92
+ end
93
+
94
+ class StrftimeTest < Test::Unit::TestCase
95
+ def test_strftime_bypassed_with_no_overrides
96
+ with_overrides_set_to(false) do
34
97
  assert_equal "Sat, Saturday, Dec, December", Time.local(2005,"dec",31).strftime("%a, %A, %b, %B")
35
98
  assert_equal "%a, %A, %b, %B", Time.local(2005,"dec",31).strftime("%%a, %%A, %%b, %%B")
36
99
  assert_equal "%Sat, %Saturday, %Dec, %December", Time.local(2005,"dec",31).strftime("%%%a, %%%A, %%%b, %%%B")
37
100
  assert_equal "Сегодня: 31 December, Saturday, 2005 год", Time.local(2005,"dec",31).strftime("Сегодня: %d %B, %A, %Y год")
38
101
  assert_equal "01 December", Time.local(1985, "dec", 01).strftime("%d %B")
39
102
  assert_equal "11 December", Time.local(1985, "dec", 11).strftime("%d %B")
40
-
41
- date = Date.new(2005, 11, 9)
42
- assert_equal "Nov November Wed Wednesday", "#{Date::ABBR_MONTHNAMES[date.mon]} #{Date::MONTHNAMES[date.mon]} #{Date::ABBR_DAYNAMES[date.wday]} #{Date::DAYNAMES[date.wday]}"
43
-
44
- RuTils::overrides = @@old_overrides
103
+ end
45
104
  end
46
105
 
47
- def test_formatter_should_actually_return
48
- the_fmt = "Это случилось %d %B"
49
- assert_equal "Это случилось 01 декабря", RuTils::DateTime::ru_strftime(Time.local(1985, "dec", 01), the_fmt)
106
+ def test_strftime_used_with_overrides
107
+ with_overrides_set_to(true) do
108
+ assert_equal "Сегодня: 31 декабря, суббота, 2005 год",
109
+ Time.local(2005,"dec",31).strftime("Сегодня: %d %B, %A, %Y год")
110
+ end
50
111
  end
51
112
 
52
- def test_formatter_should_not_mutate_passed_format_strings
53
- the_fmt, backup = "Это случилось %d %B", "Это случилось %d %B"
54
- assert_equal "Это случилось 01 декабря", RuTils::DateTime::ru_strftime(Time.local(1985, "dec", 01), the_fmt)
55
- assert_equal the_fmt, backup
113
+ def test_overrides_should_be_thread_safe
114
+ a = Thread.new do
115
+ 120.times do
116
+ RuTils::overrides = true
117
+ sleep(rand(10)/200.0)
118
+ assert_equal "11 декабря", Time.local(1985, "dec", 11).strftime("%d %B")
119
+ RuTils::overrides = false
120
+ end
121
+ end
122
+
123
+ b = Thread.new do
124
+ 120.times do
125
+ RuTils::overrides = false
126
+ sleep(rand(10)/200.0)
127
+ assert_equal "11 December", Time.local(1985, "dec", 11).strftime("%d %B")
128
+ RuTils::overrides = true
129
+ end
130
+ end
131
+
132
+ ensure
133
+ a.join; b.join
134
+ end
135
+
136
+ def with_overrides_set_to(value, &blk)
137
+ begin
138
+ RuTils::overrides, s = value, RuTils::overrides_enabled?
139
+ yield
140
+ ensure;
141
+ RuTils::overrides = s
142
+ end
56
143
  end
57
144
  end
145
+
146
+
@@ -2,29 +2,31 @@ $KCODE = 'u'
2
2
  require 'rubygems'
3
3
  require 'test/unit'
4
4
 
5
- begin
6
- require 'multi_rails_init'
7
- rescue LoadError
8
- $stderr.puts "Please install multi_rails for regression testing!"
5
+ def requiring_with_dependencies(*tests)
6
+ begin
7
+ yield
8
+ tests.map {|t| require File.join(File.dirname(__FILE__), t) }
9
+ rescue LoadError => e
10
+ $stderr.puts "Skipping integration test - #{e}"
11
+ end
9
12
  end
10
13
 
11
- begin
14
+ requiring_with_dependencies { require 'multi_rails_init' }
15
+
16
+ requiring_with_dependencies('test_rails_helpers', 'test_rails_filter') do
12
17
  require 'action_controller' unless defined?(ActionController)
13
18
  require 'action_view' unless defined?(ActionView)
14
- rescue LoadError
15
- $skip_rails = true
16
19
  end
17
20
 
18
- begin
19
- require 'RedCloth' unless defined?(RedCloth)
20
- rescue LoadError
21
- $skip_redcloth = true
22
- end
23
21
 
24
- begin
25
- require 'BlueCloth' unless defined?(BlueCloth)
26
- rescue LoadError
27
- $skip_bluecloth = true
22
+ requiring_with_dependencies('test_integration_bluecloth') { require 'bluecloth' }
23
+ requiring_with_dependencies do
24
+ require 'RedCloth' unless defined? RedCloth
25
+ if RedCloth::VERSION =~ /^3/
26
+ require File.dirname(__FILE__) + '/test_integration_redcloth3'
27
+ else
28
+ require File.dirname(__FILE__) + '/test_integration_redcloth4'
29
+ end
28
30
  end
29
31
 
30
32
  require File.dirname(__FILE__) + '/../lib/rutils'
@@ -41,129 +43,4 @@ class IntegrationFlagTest < Test::Unit::TestCase
41
43
  RuTils::overrides = true
42
44
  assert RuTils::overrides_enabled?
43
45
  end
44
- end
45
-
46
- # Интеграция с RedCloth - Textile.
47
- # Нужно иметь в виду что Textile осуществляет свою обработку типографики, которую мы подменяем!
48
- class TextileIntegrationTest < Test::Unit::TestCase
49
- def test_integration_textile
50
- raise "You must have RedCloth to test Textile integration" and return if $skip_redcloth
51
-
52
- RuTils::overrides = true
53
- assert RuTils.overrides_enabled?
54
- assert_equal "<p>И&#160;вот &#171;они пошли туда&#187;, и&#160;шли шли&#160;шли</p>",
55
- RedCloth.new('И вот "они пошли туда", и шли шли шли').to_html
56
-
57
- RuTils::overrides = false
58
- assert !RuTils::overrides_enabled?
59
- assert_equal '<p><strong>strong text</strong> and <em>emphasized text</em></p>',
60
- RedCloth.new("*strong text* and _emphasized text_").to_html, "Spaces should be preserved \
61
- without RuTils"
62
-
63
- RuTils::overrides = true
64
- assert RuTils.overrides_enabled?
65
- assert_equal '<p><strong>strong text</strong> and <em>emphasized text</em></p>',
66
- RedCloth.new("*strong text* and _emphasized text_").to_html, "Spaces should be preserved"
67
-
68
- RuTils::overrides = false
69
- assert !RuTils.overrides_enabled?
70
- assert_equal "<p>И вот &#8220;они пошли туда&#8221;, и шли шли шли</p>",
71
- RedCloth.new('И вот "они пошли туда", и шли шли шли').to_html
72
-
73
- end
74
- end
75
-
76
- # Интеграция с BlueCloth - Markdown
77
- # Сам Markdown никакой обработки типографики не производит (это делает RubyPants, но вряд ли его кто-то юзает на практике)
78
- class MarkdownIntegrationTest < Test::Unit::TestCase
79
- def test_integration_markdown
80
- raise "You must have BlueCloth to test Markdown integration" and return if $skip_bluecloth
81
-
82
- RuTils::overrides = true
83
- assert RuTils.overrides_enabled?
84
- assert_equal "<p>И вот&#160;&#171;они пошли туда&#187;, и&#160;шли шли&#160;шли</p>",
85
- BlueCloth.new('И вот "они пошли туда", и шли шли шли').to_html
86
-
87
- RuTils::overrides = false
88
- assert !RuTils.overrides_enabled?
89
- assert_equal "<p>И вот \"они пошли туда\", и шли шли шли</p>",
90
- BlueCloth.new('И вот "они пошли туда", и шли шли шли').to_html
91
- end
92
- end
93
-
94
- TEST_DATE = Date.parse("1983-10-15") # coincidentially...
95
- TEST_TIME = Time.local(1983, 10, 15, 12, 15) # also coincidentially...
96
-
97
- # Перегрузка helper'ов Rails
98
- class RailsHelpersOverrideTest < Test::Unit::TestCase
99
- # Вспомогательный класс для тестирования перегруженного DateHelper
100
- class HelperStub
101
- # для тестирования to_datetime_select_tag
102
- def date_field; TEST_TIME; end
103
- end
104
-
105
- def setup
106
- raise "You must have Rails to test ActionView integration" and return if $skip_rails
107
-
108
- RuTils::overrides = true
109
- # А никто и не говорил что класс должен быть один :-)
110
- k = Class.new(HelperStub)
111
- [ActionView::Helpers::TagHelper, ActionView::Helpers::DateHelper].each{|m| k.send(:include, m)}
112
- @stub = k.new
113
- end
114
-
115
- def test_distance_of_time_in_words
116
- assert_equal "20 минут", @stub.distance_of_time_in_words(Time.now - 20.minutes, Time.now)
117
- end
118
-
119
- # TODO - TextMate это не хайлайтит, и это _крайне_ достает
120
- def test_select_month
121
- assert_match /июль/, @stub.select_month(TEST_DATE),
122
- "Месяц в выборе месяца должен быть указан в именительном падеже"
123
- assert_match />7\<\/option\>/, @stub.select_month(TEST_DATE, :use_month_numbers => true),
124
- "Хелпер select_month с номером месяца вместо названия месяца"
125
- assert_match /10\ \-\ октябрь/, @stub.select_month(TEST_DATE, :add_month_numbers => true),
126
- "Хелпер select_month с номером и названием месяца"
127
- assert_match /\>июн\<\/option\>/, @stub.select_month(TEST_DATE, :use_short_month => true),
128
- "Короткое имя месяца при использовании опции :use_short_month"
129
- assert_match /name\=\"date\[foobar\]\"/, @stub.select_month(TEST_DATE, :field_name => "foobar"),
130
- "Хелпер select_month должен принимать опцию :field_name"
131
- assert_match /type\=\"hidden\".+value\=\"10\"/m, @stub.select_month(TEST_DATE, :use_hidden => true),
132
- "Хелпер select_month должен принимать опцию :use_hidden"
133
- end
134
-
135
- def test_select_date
136
- assert_match /date\_day.+date\_month.+date\_year/m, @stub.select_date(TEST_DATE),
137
- "Хелпер select_date должен выводить поля в следующем порядке: день, месяц, год"
138
- assert_match /декабря/, @stub.select_date(TEST_DATE),
139
- "Имя месяца должно быть указано в родительном падеже"
140
- assert_match /декабря/, @stub.select_date(TEST_DATE, :order => [:month, :year]),
141
- "Хелпер select_date не позволяет опускать фрагменты, имя месяца должно быть указано в родительном падеже"
142
- assert_match @stub.select_date, @stub.select_date(Time.now),
143
- "Хелпер select_date без параметров работает с текущей датой"
144
- end
145
-
146
- def test_select_datetime
147
- assert_match /date\_day.+date\_month.+date\_year/m, @stub.select_datetime(TEST_TIME),
148
- "Хелпер select_datetime должен выводить поля в следующем порядке: день, месяц, год"
149
- end
150
-
151
- def test_html_options
152
- if ActionView::Helpers::DateHelper::DATE_HELPERS_RECEIVE_HTML_OPTIONS
153
- assert_match /id\=\"foobar\"/m, @stub.select_month(TEST_DATE, {}, :id => "foobar"),
154
- "Хелпер select_month принимает html_options"
155
-
156
- assert_match /id\=\"foobar\"/m, @stub.select_date(TEST_DATE, {}, :id => "foobar"),
157
- "Хелпер select_date принимает html_options"
158
- end
159
- end
160
-
161
- def test_instance_tag
162
- @it = ActionView::Helpers::InstanceTag.new(:stub, :date_field, self).to_datetime_select_tag
163
- assert_match /\>10\<.+\>октября\<.+\>1983\</m, @it,
164
- "to_datetime_select_rag должен выводить поля в следующем порядке: день, месяц, год"
165
- assert_match /июля/m, @it,
166
- "to_datetime_select_tag выводит месяц в родительном падеже"
167
- end
168
- end
169
-
46
+ end
data/test/t_pluralize.rb CHANGED
@@ -34,14 +34,26 @@ class PropisjuTestCase < Test::Unit::TestCase
34
34
  assert_equal "колес", 260.items("колесо", "колеса", "колес")
35
35
  end
36
36
 
37
- def test_money
37
+ def test_rublej
38
38
  assert_equal "сто двадцать три рубля", 123.rublej
39
39
  assert_equal "триста сорок три рубля двадцать копеек", (343.20).rublej
40
40
  assert_equal "сорок две копейки", (0.4187).rublej
41
41
  assert_equal "триста тридцать два рубля", (331.995).rublej
42
42
  assert_equal "один рубль", 1.rubl
43
43
  assert_equal "три рубля четырнадцать копеек", (3.14).rublja
44
- end
44
+ end
45
+
46
+ def test_kopeek
47
+ assert_equal "сто двадцать три рубля", 12300.kopeek
48
+ assert_equal "три рубля четырнадцать копеек", 314.kopeek
49
+ assert_equal "тридцать две копейки", 32.kopeek
50
+ assert_equal "двадцать одна копейка", 21.kopeika
51
+ assert_equal "три копейки", 3.kopeiki
52
+ end
53
+
54
+ def test_kopeek_should_not_be_available_on_floats
55
+ assert_raise(NoMethodError) { (3.3).kopeek }
56
+ end
45
57
  end
46
58
 
47
59
  #class PluralizeTestCase < Test::Unit::TestCase
@@ -90,20 +90,20 @@ class BiDiTranslitTest < Test::Unit::TestCase
90
90
  end
91
91
 
92
92
  def test_bidi_translify
93
- @strings_all_with_slash.each do |strFrom, strTo|
94
- assert_equal strTo, strFrom.bidi_translify
93
+ @strings_all_with_slash.each do |str_from, str_to|
94
+ assert_equal str_to, str_from.bidi_translify
95
95
  end
96
- @strings_tran_without_slash.each do |strFrom, strTo|
97
- assert_equal strTo, strFrom.bidi_translify(false)
96
+ @strings_tran_without_slash.each do |str_from, str_to|
97
+ assert_equal str_to, str_from.bidi_translify(false)
98
98
  end
99
99
  end
100
100
 
101
101
  def test_bidi_detranslify
102
- @strings_all_with_slash.each do |strTo, strFrom|
103
- assert_equal strTo, strFrom.bidi_detranslify
102
+ @strings_all_with_slash.each do |str_to, str_from|
103
+ assert_equal str_to, str_from.bidi_detranslify
104
104
  end
105
- @strings_detran_without_slash.each do |strTo, strFrom|
106
- assert_equal strTo, strFrom.bidi_detranslify(false)
105
+ @strings_detran_without_slash.each do |str_to, str_from|
106
+ assert_equal str_to, str_from.bidi_detranslify(false)
107
107
  end
108
108
  end
109
109
  end
@@ -0,0 +1,17 @@
1
+ # Интеграция с BlueCloth - Markdown
2
+ # Сам Markdown никакой обработки типографики не производит (это делает RubyPants, но вряд ли его кто-то юзает на практике)
3
+ class MarkdownIntegrationTest < Test::Unit::TestCase
4
+ def test_integration_markdown
5
+ raise "You must have BlueCloth to test Markdown integration" and return if $skip_bluecloth
6
+
7
+ RuTils::overrides = true
8
+ assert RuTils.overrides_enabled?
9
+ assert_equal "<p>И вот&#160;&#171;они пошли туда&#187;, и&#160;шли шли&#160;шли</p>",
10
+ BlueCloth.new('И вот "они пошли туда", и шли шли шли').to_html
11
+
12
+ RuTils::overrides = false
13
+ assert !RuTils.overrides_enabled?
14
+ assert_equal "<p>И вот \"они пошли туда\", и шли шли шли</p>",
15
+ BlueCloth.new('И вот "они пошли туда", и шли шли шли').to_html
16
+ end
17
+ end
@@ -0,0 +1,31 @@
1
+ # Интеграция с RedCloth - Textile.
2
+ # Нужно иметь в виду что Textile осуществляет свою обработку типографики, которую мы подменяем!
3
+ class Redcloth3IntegrationTest < Test::Unit::TestCase
4
+ def test_integration_textile
5
+ raise "You must have RedCloth to test Textile integration" and return if $skip_redcloth
6
+
7
+ RuTils::overrides = true
8
+ assert RuTils.overrides_enabled?
9
+
10
+ assert_equal "<p>И&#160;вот &#171;они пошли туда&#187;, и&#160;шли шли&#160;шли</p>",
11
+ RedCloth.new('И вот "они пошли туда", и шли шли шли').to_html
12
+
13
+ RuTils::overrides = false
14
+ assert !RuTils::overrides_enabled?
15
+ assert_equal '<p><strong>strong text</strong> and <em>emphasized text</em></p>',
16
+ RedCloth.new("*strong text* and _emphasized text_").to_html,
17
+ "Spaces should be preserved without RuTils"
18
+
19
+ RuTils::overrides = true
20
+ assert RuTils.overrides_enabled?
21
+ assert_equal '<p><strong>strong text</strong> and <em>emphasized text</em></p>',
22
+ RedCloth.new("*strong text* and _emphasized text_").to_html,
23
+ "Spaces should be preserved"
24
+
25
+ RuTils::overrides = false
26
+ assert !RuTils.overrides_enabled?
27
+ assert_equal "<p>И вот &#8220;они пошли туда&#8221;, и шли шли шли</p>",
28
+ RedCloth.new('И вот "они пошли туда", и шли шли шли').to_html
29
+
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ # Интеграция с RedCloth - Textile.
2
+ # Нужно иметь в виду что Textile осуществляет свою обработку типографики, которую мы подменяем!
3
+ class Redcloth4IntegrationTest < Test::Unit::TestCase
4
+ def test_integration_textile
5
+ raise "You must have RedCloth to test Textile integration" and return if $skip_redcloth
6
+
7
+ RuTils::overrides = true
8
+ assert RuTils.overrides_enabled?
9
+
10
+ assert_equal "<p>И вот&#160;&#171;они пошли туда&#187;, и&#160;шли шли&#160;шли</p>",
11
+ RedCloth.new('И вот "они пошли туда", и шли шли шли').to_html
12
+
13
+ RuTils::overrides = false
14
+ assert !RuTils::overrides_enabled?
15
+ assert_equal '<p><strong>strong text</strong> and <em>emphasized text</em></p>',
16
+ RedCloth.new("*strong text* and _emphasized text_").to_html,
17
+ "Spaces should be preserved without RuTils"
18
+
19
+ RuTils::overrides = true
20
+ assert RuTils.overrides_enabled?
21
+ assert_equal '<p><strong>strong text</strong> and&#160;<em>emphasized text</em></p>',
22
+ RedCloth.new("*strong text* and _emphasized text_").to_html,
23
+ "Spaces should be preserved"
24
+
25
+ RuTils::overrides = false
26
+ assert !RuTils.overrides_enabled?
27
+ assert_equal "<p>И вот &#8220;они пошли туда&#8221;, и шли шли шли</p>",
28
+ RedCloth.new('И вот "они пошли туда", и шли шли шли').to_html
29
+
30
+ end
31
+ end
@@ -0,0 +1,27 @@
1
+ require 'action_controller/test_process'
2
+ require File.dirname(__FILE__) + '/../init.rb'
3
+
4
+ ActionController::Routing::Routes.draw { |map| map.connect ':controller/:action/:id' }
5
+
6
+ class RutiledController < ActionController::Base #:nodoc:
7
+ def overridden
8
+ raise "Overrides are off" unless RuTils::overrides_enabled?
9
+ render :inline => '<%= Time.local(2008,8,8).strftime("%B") %>'
10
+ end
11
+ def rescue_action(e); raise e; end
12
+ end
13
+
14
+ class RailsFilterTest < Test::Unit::TestCase
15
+
16
+ def setup
17
+ @controller = RutiledController.new
18
+ @request = ActionController::TestRequest.new
19
+ @response = ActionController::TestResponse.new
20
+ end
21
+
22
+ def test_overrides_preserved_in_render
23
+ assert_nothing_raised { get :overridden }
24
+ assert_response :success
25
+ assert_equal "август", @response.body
26
+ end
27
+ end
@@ -0,0 +1,73 @@
1
+ TEST_DATE = Date.parse("1983-10-15") # coincidentially...
2
+ TEST_TIME = Time.local(1983, 10, 15, 12, 15) # also coincidentially...
3
+
4
+ # Перегрузка helper'ов Rails
5
+ class RailsHelpersOverrideTest < Test::Unit::TestCase
6
+ # Вспомогательный класс для тестирования перегруженного DateHelper
7
+ class HelperStub
8
+ # для тестирования to_datetime_select_tag
9
+ def date_field; TEST_TIME; end
10
+ end
11
+
12
+ def setup
13
+ RuTils::overrides = true
14
+ # А никто и не говорил что класс должен быть один :-)
15
+ k = Class.new(HelperStub)
16
+ [ActionView::Helpers::TagHelper, ActionView::Helpers::DateHelper].each{|m| k.send(:include, m)}
17
+ @stub = k.new
18
+ end
19
+
20
+ def test_distance_of_time_in_words
21
+ assert_equal "20 минут", @stub.distance_of_time_in_words(Time.now - 20.minutes, Time.now)
22
+ end
23
+
24
+ # TODO - TextMate это не хайлайтит, и это _крайне_ достает
25
+ def test_select_month
26
+ assert_match /июль/, @stub.select_month(TEST_DATE),
27
+ "Месяц в выборе месяца должен быть указан в именительном падеже"
28
+ assert_match />7\<\/option\>/, @stub.select_month(TEST_DATE, :use_month_numbers => true),
29
+ "Хелпер select_month с номером месяца вместо названия месяца"
30
+ assert_match /10\ \-\ октябрь/, @stub.select_month(TEST_DATE, :add_month_numbers => true),
31
+ "Хелпер select_month с номером и названием месяца"
32
+ assert_match /\>июн\<\/option\>/, @stub.select_month(TEST_DATE, :use_short_month => true),
33
+ "Короткое имя месяца при использовании опции :use_short_month"
34
+ assert_match /name\=\"date\[foobar\]\"/, @stub.select_month(TEST_DATE, :field_name => "foobar"),
35
+ "Хелпер select_month должен принимать опцию :field_name"
36
+ assert_match /type\=\"hidden\".+value\=\"10\"/m, @stub.select_month(TEST_DATE, :use_hidden => true),
37
+ "Хелпер select_month должен принимать опцию :use_hidden"
38
+ end
39
+
40
+ def test_select_date
41
+ assert_match /date\_day.+date\_month.+date\_year/m, @stub.select_date(TEST_DATE),
42
+ "Хелпер select_date должен выводить поля в следующем порядке: день, месяц, год"
43
+ assert_match /декабря/, @stub.select_date(TEST_DATE),
44
+ "Имя месяца должно быть указано в родительном падеже"
45
+ assert_match /декабря/, @stub.select_date(TEST_DATE, :order => [:month, :year]),
46
+ "Хелпер select_date не позволяет опускать фрагменты, имя месяца должно быть указано в родительном падеже"
47
+ assert_match @stub.select_date, @stub.select_date(Time.now),
48
+ "Хелпер select_date без параметров работает с текущей датой"
49
+ end
50
+
51
+ def test_select_datetime
52
+ assert_match /date\_day.+date\_month.+date\_year/m, @stub.select_datetime(TEST_TIME),
53
+ "Хелпер select_datetime должен выводить поля в следующем порядке: день, месяц, год"
54
+ end
55
+
56
+ def test_html_options
57
+ if ActionView::Helpers::DateHelper::DATE_HELPERS_RECEIVE_HTML_OPTIONS
58
+ assert_match /id\=\"foobar\"/m, @stub.select_month(TEST_DATE, {}, :id => "foobar"),
59
+ "Хелпер select_month принимает html_options"
60
+
61
+ assert_match /id\=\"foobar\"/m, @stub.select_date(TEST_DATE, {}, :id => "foobar"),
62
+ "Хелпер select_date принимает html_options"
63
+ end
64
+ end
65
+
66
+ def test_instance_tag
67
+ @it = ActionView::Helpers::InstanceTag.new(:stub, :date_field, self).to_datetime_select_tag
68
+ assert_match /\>10\<.+\>октября\<.+\>1983\</m, @it,
69
+ "to_datetime_select_rag должен выводить поля в следующем порядке: день, месяц, год"
70
+ assert_match /июля/m, @it,
71
+ "to_datetime_select_tag выводит месяц в родительном падеже"
72
+ end
73
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rutils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julian 'Julik' Tarkhanov
@@ -11,7 +11,7 @@ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
13
 
14
- date: 2008-07-10 00:00:00 +04:00
14
+ date: 2008-08-08 00:00:00 +04:00
15
15
  default_executable:
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
@@ -53,7 +53,10 @@ files:
53
53
  - lib/integration/blue_cloth_override.rb
54
54
  - lib/integration/integration.rb
55
55
  - lib/integration/rails_date_helper_override.rb
56
+ - lib/integration/rails_pre_filter.rb
57
+ - lib/integration/red_cloth_four.rb
56
58
  - lib/integration/red_cloth_override.rb
59
+ - lib/integration/red_cloth_three.rb
57
60
  - lib/pluralizer/pluralizer.rb
58
61
  - lib/rutils.rb
59
62
  - lib/transliteration/bidi.rb
@@ -66,6 +69,11 @@ files:
66
69
  - test/t_pluralize.rb
67
70
  - test/t_rutils_base.rb
68
71
  - test/t_transliteration.rb
72
+ - test/test_integration_bluecloth.rb
73
+ - test/test_integration_redcloth3.rb
74
+ - test/test_integration_redcloth4.rb
75
+ - test/test_rails_filter.rb
76
+ - test/test_rails_helpers.rb
69
77
  has_rdoc: true
70
78
  homepage: http://rutils.rubyforge.org
71
79
  post_install_message: