rutils 1.0.3 → 1.1.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/History.txt CHANGED
@@ -1,3 +1,11 @@
1
+ === 1.1.1 - 15.10.2010
2
+
3
+ * rutils довольно-таки старая штука. Для тех кто пользуется Gilenson мы теперь сервируем его отдельно и используем его из rutils. В связи с этим
4
+ gilensize удален а все детали rutils использующие форматирование теперь автоматом будут использовать новый гем. Если вы правильно ставите
5
+ приложение то при выкатке недостающий гем поставится автоматом поскольку gilenson теперь зависимость для rutils.
6
+ * включены патчи от многочисленных доброжелателей и злопыхателей
7
+ * гем по-прежнему совместим со старыми рельсами
8
+
1
9
  === 1.0.3 - 09.02.2009
2
10
 
3
11
  * Предотвращена загрузка date helper overridesв при установленном russian gem
data/Manifest.txt CHANGED
@@ -3,14 +3,12 @@ Manifest.txt
3
3
  README.txt
4
4
  Rakefile.rb
5
5
  TODO.txt
6
- WHAT_HAS_CHANGED.txt
7
- bin/gilensize
8
6
  bin/rutilize
9
7
  init.rb
10
8
  lib/countries/countries.rb
11
9
  lib/datetime/datetime.rb
12
10
  lib/gilenson/bluecloth_extra.rb
13
- lib/gilenson/gilenson.rb
11
+ lib/gilenson/gilenson_stub.rb
14
12
  lib/gilenson/helper.rb
15
13
  lib/gilenson/maruku_extra.rb
16
14
  lib/gilenson/rdiscount_extra.rb
@@ -34,7 +32,6 @@ test/extras/integration_redcloth3.rb
34
32
  test/extras/integration_redcloth4.rb
35
33
  test/run_tests.rb
36
34
  test/test_datetime.rb
37
- test/test_gilenson.rb
38
35
  test/test_integration.rb
39
36
  test/test_integration_flag.rb
40
37
  test/test_pluralize.rb
data/README.txt CHANGED
@@ -6,10 +6,6 @@ RuTils - простой обработчик русского текста на
6
6
  Основная цель RuTils - сделать разработку русскоязычных приложений на Ruby (и Rails) максимально простой
7
7
  и приятной (в идеале - столь же простой как и разработку оных на английском).
8
8
 
9
- == Шеф! все пропало! я обновил RuTils и он работает совершенно по-другому!
10
-
11
- Раздел также известен под именем "Что поменялось в RuTils 1.0.0". Вам {сюда.}[link:files/WHAT_HAS_CHANGED_txt.html]
12
-
13
9
  == Чье это
14
10
 
15
11
  Разработчики RuTils - {Julik}[http://julik.nl], {Mash}[http://imfo.ru], {Yaroslav Markin}[http://markin.net/]
data/Rakefile.rb CHANGED
@@ -26,6 +26,7 @@ begin
26
26
  p.email = ['me@julik.nl', 'yaroslav@markin.net']
27
27
  p.description = 'Simple processing of russian strings'
28
28
  p.summary = 'Simple processing of russian strings'
29
+ p.extra_deps = {"gilenson" => ">=0"}
29
30
  p.remote_rdoc_dir = ''
30
31
  p.need_zip = true # ненвижу
31
32
  end
data/TODO.txt CHANGED
@@ -1,6 +1,3 @@
1
1
  =TODO
2
2
 
3
- ==Rails
4
-
5
- ==Вообще
6
- * Выносим Гиленсона в отдельный гем
3
+ * Перевести все 78239198398132 задеплоенных приложений за апгрейд которых не платят на i18n+gilenson. Повторить до посинения.
data/init.rb CHANGED
@@ -17,11 +17,11 @@ def russan_gem_required?
17
17
  false
18
18
  end
19
19
 
20
- RUTILS_USE_DATE_HELPERS = if russan_gem_required?
21
- STDERR.puts "RuTils: On this version of Rails use the `russian` gem for date helper overrides instead"
22
- false
20
+ if russan_gem_required?
21
+ STDERR.puts "RuTils WARNING: On this version of Rails use the `russian` gem for date helper overrides instead"
23
22
  else
24
- true
23
+ require File.dirname(__FILE__) + '/lib/integration/rails_date_helper_override'
24
+ ::ActionController::Base.send(:helper, RuTils::DateHelper)
25
25
  end
26
26
 
27
27
  # textilize и markdown
@@ -0,0 +1,21 @@
1
+ require "gilenson"
2
+
3
+ # -*- encoding: utf-8 -*-
4
+ module RuTils
5
+ module Gilenson
6
+ # Позволяет возвращать класс форматтера при вызове
7
+ # RuTils::Gilenson.new
8
+ def self.new(*args) #:nodoc:
9
+ ::Gilenson.new(*args)
10
+ end
11
+
12
+ autoload :BlueClothExtra, File.dirname(__FILE__) + '/bluecloth_extra'
13
+ autoload :RedClothExtra, File.dirname(__FILE__) + '/redcloth_extra'
14
+ autoload :RDiscountExtra, File.dirname(__FILE__) + '/rdiscount_extra'
15
+ autoload :MarukuExtra, File.dirname(__FILE__) + '/maruku_extra'
16
+ autoload :Helper, File.dirname(__FILE__) + '/helper'
17
+ end
18
+ end
19
+
20
+ # Этот класс теперь живет в геме gilenson.
21
+ RuTils::Gilenson::Formatter = ::Gilenson
@@ -1,12 +1,11 @@
1
1
  # -*- encoding: utf-8 -*-
2
- module Object::ActionView::Helpers::DateHelper
3
- # Несколько хаков для корректной работы модуля с Rails 1.2--2.0 одновременно с Rails 2.1 и выше.
4
-
2
+ module RuTils::DateHelper
3
+ # Несколько вторжений :-) для корректной работы модуля с Rails 1.2--2.0 одновременно с Rails 2.1 и выше.
5
4
  # Хелперы DateHelper принимают параметр <tt>html_options</tt> (идет последним) начиная с Rails 2.1.
6
5
  # Нужно понять, имеем ли мы дело с Rails 2.1+, для этого проверяем наличие классметода helper_modules у
7
6
  # ActionView::Base, который появился как раз в версии 2.1.
8
7
  DATE_HELPERS_RECEIVE_HTML_OPTIONS = ActionView::Base.respond_to?(:helper_modules) #:nodoc:
9
-
8
+
10
9
  # В Rails Edge (2.1+) определяется <tt>Time.current</tt> для работы с временными зонами.
11
10
  unless Time.respond_to? :current
12
11
  class << ::Time # :nodoc:
@@ -25,17 +24,20 @@ module Object::ActionView::Helpers::DateHelper
25
24
  #
26
25
  # Целые числа интерпретируются как секунды.
27
26
  # <tt>distance_of_time_in_words(50)</tt> возвращает "меньше минуты".
28
- alias :stock_distance_of_time_in_words :distance_of_time_in_words
29
27
  def distance_of_time_in_words(*args)
30
- RuTils::overrides_enabled? ? RuTils::DateTime::distance_of_time_in_words(*args) : stock_distance_of_time_in_words
28
+ RuTils::overrides_enabled? ? RuTils::DateTime::distance_of_time_in_words(*args) : super
31
29
  end
32
-
30
+
33
31
  # Заменяет ActionView::Helpers::DateHelper::select_month меню выбора русских месяцев.
34
32
  #
35
33
  # select_month(Date.today) # Использует ключи "Январь", "Март"
36
34
  # select_month(Date.today, :use_month_numbers => true) # Использует ключи "1", "3"
37
35
  # select_month(Date.today, :add_month_numbers => true) # Использует ключи "1 - Январь", "3 - Март"
38
36
  def select_month(date, options = {}, html_options = {})
37
+
38
+ # Выпрыгиваем пораньше на всякий случай
39
+ return super unless RuTils::overrides_enabled?
40
+
39
41
  locale = options[:locale] unless RuTils::overrides_enabled?
40
42
 
41
43
  val = date ? (date.kind_of?(Fixnum) ? date : date.month) : ''
@@ -97,31 +99,18 @@ module Object::ActionView::Helpers::DateHelper
97
99
  end
98
100
  end
99
101
 
100
- alias :stock_select_date :select_date
101
102
  # Заменяет ActionView::Helpers::DateHelper::select_date меню выбора русской даты.
102
103
  def select_date(date = Date.current, options = {}, html_options = {})
103
104
  options[:order] ||= [:day, :month, :year]
104
105
  if DATE_HELPERS_RECEIVE_HTML_OPTIONS
105
- stock_select_date(date, options, html_options)
106
+ super(date, options, html_options)
106
107
  else
107
- stock_select_date(date, options)
108
+ super(date, options)
108
109
  end
109
110
  end
111
+
110
112
  end
111
113
 
112
- module Object::ActionView::Helpers
113
- if defined?(InstanceTag) && InstanceTag.private_method_defined?(:date_or_time_select)
114
- class InstanceTag #:nodoc:
115
- private
116
- alias :stock_date_or_time_select :date_or_time_select
117
- def date_or_time_select(options, html_options = {})
118
- options[:order] ||= [:day, :month, :year]
119
- if DATE_HELPERS_RECEIVE_HTML_OPTIONS
120
- stock_date_or_time_select(options, html_options)
121
- else
122
- stock_date_or_time_select(options)
123
- end
124
- end
125
- end
126
- end
127
- end
114
+ if defined?(Object::ActionView::Helpers::InstanceTag)
115
+ Object::ActionView::Helpers::InstanceTag.send(:include, RuTils::DateHelper) # kaboom! наш хелпер загружен ПОСЛЕ стандартного а следовательно имеет приоритет
116
+ end
@@ -24,6 +24,23 @@ module RuTils
24
24
  pts.join(' ')
25
25
  end
26
26
 
27
+ # Выводит целое или дробное число как сумму в гривнах прописью
28
+ def self.griven(amount)
29
+ pts = []
30
+
31
+ pts << RuTils::Pluralization::sum_string(amount.to_i, 2, "гривна", "гривны", "гривен") unless amount.to_i == 0
32
+ if amount.kind_of?(Float)
33
+ remainder = (amount.divmod(1)[1]*100).round
34
+ if (remainder == 100)
35
+ pts = [RuTils::Pluralization::sum_string(amount.to_i+1, 2, 'гривна', 'гривны', 'гривен')]
36
+ else
37
+ pts << RuTils::Pluralization::sum_string(remainder.to_i, 2, 'копейка', 'копейки', 'копеек')
38
+ end
39
+ end
40
+
41
+ pts.join(' ')
42
+ end
43
+
27
44
  def self.kopeek(amount)
28
45
  pts = []
29
46
  r, k = (amount/100.0).floor, (amount - ((amount/100.0).floor * 100)).to_i
@@ -236,6 +253,16 @@ module RuTils
236
253
  end
237
254
  alias :rubl :rublej
238
255
  alias :rublja :rublej
256
+
257
+ # Выводит сумму в гривнах прописью. Например:
258
+ # * (15.4).griven => "пятнадцать гривен сорок копеек"
259
+ # * 1.grivna => "одна гривна"
260
+ # * (3.14).grivny => "три гривны четырнадцать копеек"
261
+ def griven
262
+ RuTils::Pluralization::griven(self)
263
+ end
264
+ alias :grivna :griven
265
+ alias :grivny :griven
239
266
  end
240
267
 
241
268
  module FixnumFormatting
data/lib/rutils.rb CHANGED
@@ -49,10 +49,14 @@ module RuTils
49
49
  end
50
50
  end
51
51
 
52
- [:pluralizer, :gilenson, :datetime, :transliteration, :countries].each do | submodule |
52
+ [:pluralizer, :datetime, :transliteration, :countries].each do | submodule |
53
53
  require File.join(RuTils::INSTALLATION_DIRECTORY, "lib", submodule.to_s, submodule.to_s)
54
54
  end
55
55
 
56
- unless defined?(RUTILS_USE_DATE_HELPERS) && !RUTILS_USE_DATE_HELPERS
56
+ # Заглушка для подключения типографа (он теперь в отдельном геме)
57
+ require File.join(RuTils::INSTALLATION_DIRECTORY, "lib/gilenson/gilenson_stub")
58
+
59
+ # Оверлоады грузим только если константа не установлена в false
60
+ unless defined?(::RuTils::RUTILS_USE_DATE_HELPERS) && !::RuTils::RUTILS_USE_DATE_HELPERS
57
61
  require File.join(RuTils::INSTALLATION_DIRECTORY, "lib", "integration", "integration")
58
62
  end
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  # ++DEPRECATED++ Этот модуль удален и присутствует только для выдачи сообщения об ошибке.
3
3
  module RuTils::Transliteration::BiDi
4
- ERR = "Equivalent bidirectional transliteration for URLs is malpractive. BiDi translit has been removed from RuTils"
4
+ ERR = "Equivalent bidirectional transliteration for URLs is malpractice. BiDi translit has been removed from RuTils"
5
5
 
6
6
  extend self
7
7
 
@@ -8,8 +8,34 @@ require File.join(File.dirname(__FILE__), 'simple')
8
8
 
9
9
  # Заглушка
10
10
  require File.join(File.dirname(__FILE__), 'bidi')
11
-
12
- # Реализует транслитерацию любого объекта, реализующего String или to_s
11
+
12
+ =begin
13
+ Реализует транслитерацию любого объекта, реализующего String или to_s.
14
+ === Почему удален BiDi-транслит?
15
+
16
+ В отличие от DHH авторы RuTils придерживаются стратегии синтактической серной кислоты вместо синтактического уксуса. Основная область
17
+ применения bidi-транслитераций - генерация "как-бы" более удобочитаемых URL. К сожалению, у нее есть ряд свойств которые делают ее
18
+ бессмысленной (кроме как в качестве упражнения по строковым итераторам Ruby). Приводим список аргументов почему вам не нужны
19
+ автоматические транслитерированные URL:
20
+
21
+ * Они будут работать только для набора символов "ASCII + русский". Любая попытка засунуть в ваш URL слово stød закончится печально.
22
+ * Они будут работать только для русского языка, кириллиц много. Транслитерация по определению языкозависима.
23
+ * Вашим пользователям придется непрерывно угадывать, пишется буква "я". "Ja"? "Ya"? "J"? Если вы хоть раз наблюдали иностранца, пытающегося
24
+ выговорить "ОВИРскую" транслитерацию вашей фамилии из загранпаспорта, вы знаете о чем мы говорим.
25
+ * Приличные браузеры не кодируют русский текст в адресной строке если Ваш вебсервер его принял. Если браузер неприличный то он позволяет этот текст ввести.
26
+ Если браузер совсем неприличный, то средство ввода у него - стилус размером с зубочистку, а пользуются им в трамвае. Вводить ваш транслит
27
+ в таких условиях все равно никто не будет, успокойтесь.
28
+
29
+ Приводить список аргументов "почему такой транслит вам нужен" мы не будем дабы никого не травмировать.
30
+
31
+ Если вам таки страшно неймется реализовать транслит в URL, рекомендуем следующий подход:
32
+
33
+ * Для адресуемого обьекта сохраняется поле ++slug++
34
+ * При сохранении в это поле автоматически пишется "дирифицированное" название, но пользователь может его вручную отредактировать
35
+ * Дальнейшая адресация производится без "транслитерации обратно", по полю slug напрямую
36
+
37
+ Дополнительно рекомендуется запретить загрузку файлов с русскими именами (с помощью Javascript и свойства value элемента input).
38
+ =end
13
39
  module RuTils::Transliteration::StringFormatting
14
40
 
15
41
  # Транслитерирует строку в латиницу, и возвращает измененную строку
data/lib/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  module RuTils
3
3
  # Версия RuTils
4
- VERSION = '1.0.3'
4
+ VERSION = '1.1.1'
5
5
  end
@@ -13,7 +13,14 @@ class RutiledController < ActionController::Base #:nodoc:
13
13
  def rescue_action(e); raise e; end
14
14
  end
15
15
 
16
- class RailsFilterTest < Test::Unit::TestCase
16
+ # Перегрузка helper'ов Rails
17
+ rails_test_class = defined?(ActionController::TestCase) ? ActionController::TestCase : Test::Unit::TestCase
18
+
19
+ class RailsFilterTest < rails_test_class
20
+
21
+ if respond_to?(:tests) # Еще одно изобретение чтобы как можно больше вещей были несовместимы от рельсов к рельсам
22
+ tests RutiledController
23
+ end
17
24
 
18
25
  def setup
19
26
  @controller = RutiledController.new
@@ -7,7 +7,9 @@ require 'action_controller/test_process'
7
7
  require File.dirname(__FILE__) + '/../../init.rb'
8
8
 
9
9
  # Перегрузка helper'ов Rails
10
- class RailsGilensonHelpersTest < Test::Unit::TestCase
10
+ rails_test_class = defined?(ActionController::TestCase) ? ActionController::TestCase : Test::Unit::TestCase
11
+
12
+ class RailsGilensonHelpersTest < rails_test_class
11
13
 
12
14
  class Kontroller < ActionController::Base
13
15
  def action_with_gilensize
@@ -41,6 +43,10 @@ class RailsGilensonHelpersTest < Test::Unit::TestCase
41
43
  end
42
44
  end
43
45
 
46
+ if respond_to?(:tests) # Еще одно изобретение чтобы как можно больше вещей были несовместимы от рельсов к рельсам
47
+ tests Kontroller
48
+ end
49
+
44
50
  def setup
45
51
  @request = ActionController::TestRequest.new
46
52
  @response = ActionController::TestResponse.new
@@ -49,32 +55,32 @@ class RailsGilensonHelpersTest < Test::Unit::TestCase
49
55
 
50
56
  def test_action_with_gilensize
51
57
  get :action_with_gilensize
52
- assert_equal 'Они&#160;пришли &#8212; туда &#8212; к&#160;А.П.&#8201;Чехову', @response.body
58
+ assert_equal 'Они&#160;пришли &#8212; туда &#8212; к&#160;А.П.&#8201;Чехову', @response.body.strip
53
59
  end
54
60
 
55
61
  def test_action_with_gilensize_and_options
56
62
  get :action_with_gilensize_and_options
57
- assert_equal "Они пришли — туда — к А.П. Чехову", @response.body
63
+ assert_equal "Они пришли — туда — к А.П. Чехову", @response.body.strip
58
64
  end
59
65
 
60
66
  def test_action_with_textilize
61
67
  get :action_with_textilize
62
- assert_equal "<p>Они пришли &#8212; туда &#8212; к&#160;А.П.&#8201;Чехову</p>", @response.body
68
+ assert_equal "<p>Они пришли &#8212; туда &#8212; к&#160;А.П.&#8201;Чехову</p>", @response.body.strip
63
69
  end
64
70
 
65
71
  def test_action_with_textilize_without_overrides
66
72
  get :action_with_textilize_without_overrides
67
- assert_equal "<p>Они пришли &#8212; туда &#8212; к А. П. Чехову</p>", @response.body, "Initials should not be formatted"
73
+ assert_equal "<p>Они пришли &#8212; туда &#8212; к А. П. Чехову</p>", @response.body.strip, "Initials should not be formatted"
68
74
  end
69
75
 
70
76
  def test_action_with_markdown
71
77
  get :action_with_markdown
72
- assert_equal "<p>Они пришли &#8212; туда &#8212; к&#160;А.П.&#8201;Чехову</p>", @response.body
78
+ assert_equal "<p>Они пришли &#8212; туда &#8212; к&#160;А.П.&#8201;Чехову</p>", @response.body.strip
73
79
  end
74
80
 
75
81
  def test_action_with_markdown_without_overrides
76
82
  get :action_with_markdown_without_overrides
77
- assert_equal "<p>Они пришли -- туда -- к А. П. Чехову</p>", @response.body
83
+ assert_equal "<p>Они пришли -- туда -- к А. П. Чехову</p>", @response.body.strip
78
84
  end
79
85
 
80
86
  end
@@ -1,8 +1,8 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
+ require "ostruct"
3
4
  require 'action_controller'
4
5
  require 'action_view'
5
-
6
6
  require 'action_controller/test_process'
7
7
  require File.dirname(__FILE__) + '/../../init.rb'
8
8
  require 'action_pack/version'
@@ -11,8 +11,12 @@ ma, mi, ti = ActionPack::VERSION::MAJOR, ActionPack::VERSION::MINOR, ActionPack:
11
11
 
12
12
  raise LoadError, "RuTils is not 2.2.2 compat" if (ma >= 2 && mi >= 2 && ti >= 1)
13
13
 
14
+
15
+ ActionController::Routing::Routes.draw { |map| map.connect ':controller/:action/:id' }
16
+ rails_test_class = defined?(ActionController::TestCase) ? ActionController::TestCase : Test::Unit::TestCase
17
+
14
18
  # Перегрузка helper'ов Rails
15
- class RailsHelpersOverrideTest < Test::Unit::TestCase
19
+ class RailsDateHelperTest < Test::Unit::TestCase
16
20
  TEST_DATE = Date.parse("1983-10-15") # coincidentially...
17
21
  TEST_TIME = Time.local(1983, 10, 15, 12, 15) # also coincidentially...
18
22
 
@@ -26,15 +30,18 @@ class RailsHelpersOverrideTest < Test::Unit::TestCase
26
30
  RuTils::overrides = true
27
31
  # А никто и не говорил что класс должен быть один :-)
28
32
  k = Class.new(HelperStub)
29
- [ActionView::Helpers::TagHelper, ActionView::Helpers::DateHelper].each{|m| k.send(:include, m)}
33
+ [ActionView::Helpers::TagHelper, ActionView::Helpers::DateHelper, RuTils::DateHelper].each{|m| k.send(:include, m)}
30
34
  @stub = k.new
31
35
  end
32
36
 
33
37
  def test_distance_of_time_in_words
38
+ RuTils::overrides = true
34
39
  assert_equal "20 минут", @stub.distance_of_time_in_words(Time.now - 20.minutes, Time.now)
35
40
  end
36
41
 
37
42
  def test_select_month
43
+ RuTils::overrides = true
44
+
38
45
  assert_match /июль/, @stub.select_month(TEST_DATE),
39
46
  "Месяц в выборе месяца должен быть указан в именительном падеже"
40
47
  assert_match />7\<\/option\>/, @stub.select_month(TEST_DATE, :use_month_numbers => true),
@@ -74,12 +81,33 @@ class RailsHelpersOverrideTest < Test::Unit::TestCase
74
81
  "Хелпер select_date принимает html_options"
75
82
  end
76
83
  end
84
+ end
85
+
86
+ class DateHelperWithControllerTest < rails_test_class
87
+ TEST_DATE = Date.parse("1983-10-15") # coincidentially...
88
+
89
+ class DatifiedController < ActionController::Base #:nodoc:
90
+ def schmoo
91
+ @widget = OpenStruct.new(:birthday => TEST_DATE)
92
+ render :inline => '<%= date_select(:widget, :birthday) %>'
93
+ end
94
+ def rescue_action(e); raise e; end
95
+ end
96
+
97
+ if respond_to?(:tests) # Еще одно изобретение чтобы как можно больше вещей были несовместимы от рельсов к рельсам
98
+ tests DatifiedController
99
+ end
77
100
 
78
- def test_instance_tag
79
- @it = ActionView::Helpers::InstanceTag.new(:stub, :date_field, self).to_datetime_select_tag
80
- assert_match /\>10\<.+\>октября\<.+\>1983\</m, @it,
81
- "to_datetime_select_rag должен выводить поля в следующем порядке: день, месяц, год"
82
- assert_match /июля/m, @it,
83
- "to_datetime_select_tag выводит месяц в родительном падеже"
101
+ def setup
102
+ @controller = DatifiedController.new
103
+ @request = ActionController::TestRequest.new
104
+ @response = ActionController::TestResponse.new
105
+ end
106
+
107
+ def test_select_month
108
+ RuTils::overrides = true
109
+
110
+ get :schmoo
111
+ assert_match /июля/, @response.body
84
112
  end
85
113
  end