rutils 1.0.3 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
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