rails-ext 0.2.0

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.
Files changed (141) hide show
  1. data/.git/COMMIT_EDITMSG +1 -0
  2. data/.git/HEAD +1 -0
  3. data/.git/config +12 -0
  4. data/.git/description +1 -0
  5. data/.git/hooks/applypatch-msg.sample +15 -0
  6. data/.git/hooks/commit-msg.sample +24 -0
  7. data/.git/hooks/post-commit.sample +8 -0
  8. data/.git/hooks/post-receive.sample +15 -0
  9. data/.git/hooks/post-update.sample +8 -0
  10. data/.git/hooks/pre-applypatch.sample +14 -0
  11. data/.git/hooks/pre-commit.sample +46 -0
  12. data/.git/hooks/pre-rebase.sample +169 -0
  13. data/.git/hooks/prepare-commit-msg.sample +36 -0
  14. data/.git/hooks/update.sample +128 -0
  15. data/.git/index +0 -0
  16. data/.git/info/exclude +6 -0
  17. data/.git/logs/HEAD +6 -0
  18. data/.git/logs/refs/heads/master +6 -0
  19. data/.git/logs/refs/remotes/origin/master +5 -0
  20. data/.git/objects/02/469b717b4bd61ad27a3fe664ce0646a8325399 +2 -0
  21. data/.git/objects/06/c3225bad9d5b80e7b3bde79ff3c2da591722bf +5 -0
  22. data/.git/objects/07/f7d26527e58caa2fa99e33b29a7791b9eb8b3e +0 -0
  23. data/.git/objects/09/20505d42c0044b31ff7b1f86cec6e282e13414 +0 -0
  24. data/.git/objects/0b/e101a0586410212b4ee5905881ad726b7b4907 +0 -0
  25. data/.git/objects/10/bfe1230b9d96e23600091cc8b4b9d378068101 +0 -0
  26. data/.git/objects/13/882df4f2ef911454bf3b69a85742b372723366 +2 -0
  27. data/.git/objects/15/3f845625a0f605a2a35487a32038d0349bc386 +0 -0
  28. data/.git/objects/18/77033b90ed3dd55a3034b7e3ca1c5c9f66868d +0 -0
  29. data/.git/objects/19/1f68644a3646d774f2546c4cd49ac7d66f4cc2 +0 -0
  30. data/.git/objects/1d/d49713de2942dc974e55adc3684f55b2b817e2 +0 -0
  31. data/.git/objects/1e/6374b23c71a07b0e414e80912fd45503bd3daf +0 -0
  32. data/.git/objects/29/7a2c413b11f78b69dd8caa4f334c9536088f8a +3 -0
  33. data/.git/objects/29/b1f8abaed4aea1da8f8bd5f1bd81c26058c41a +3 -0
  34. data/.git/objects/2a/04524c8458b2d0cd9bcec579f9d54368a9d35f +0 -0
  35. data/.git/objects/2d/043376f1bc26b2dad3e79fc72ea14341ea437d +0 -0
  36. data/.git/objects/2e/3e3fc8e46949a9b944da3c36207c444aa2c9b7 +0 -0
  37. data/.git/objects/30/69d4978bbdfacf4402c4339438b29657275f2c +0 -0
  38. data/.git/objects/36/9902ca51d5820a02ccccbf1cac6ed09051941d +0 -0
  39. data/.git/objects/3a/03b9d44de43472689300120ffb2a0a9a74f27f +0 -0
  40. data/.git/objects/3a/797683953be7e6d0ffa0e34514f3e8e9c3ceb0 +3 -0
  41. data/.git/objects/3f/3db6bb5a5204ae58e303959c4c0da3a70d8b35 +1 -0
  42. data/.git/objects/40/215c0554202fc46dc2fca94ed21e2920ce1e84 +0 -0
  43. data/.git/objects/4b/2bdb2dc6330ba9bafd9058ec8eaa925ef53f91 +0 -0
  44. data/.git/objects/4d/991a018b0c697fa119efe7aaf55df0a1c7af8e +0 -0
  45. data/.git/objects/4f/fa8f1c9b7e3fdbb23ab600722d1011dcb48cec +2 -0
  46. data/.git/objects/55/d1f1efc344266d472094b1fd2f247b97de1c8b +0 -0
  47. data/.git/objects/57/8a722fd66124331e07123e3a0de2b6b50a581b +3 -0
  48. data/.git/objects/59/0ef6ba9931d75fbddc7a940044dbaaa50efc76 +0 -0
  49. data/.git/objects/5a/35fa85474278f3c817aa59d07b725428c41a28 +0 -0
  50. data/.git/objects/60/a681e873ca0ae0b7da3f37dbc5701f6e42b970 +1 -0
  51. data/.git/objects/61/32f3f8005ce5b88165162ac5542e54d0472a82 +3 -0
  52. data/.git/objects/65/51094fa3b996ff25b88d7ddb21d21a811d53fc +2 -0
  53. data/.git/objects/67/850cf1ede94d80c9b07ceace074a4d62f15249 +0 -0
  54. data/.git/objects/68/8ce506ac4f7c160bd6880d8507820761a3b3b7 +0 -0
  55. data/.git/objects/6d/f725e3519872a75bc763045f00d8844eb890cf +0 -0
  56. data/.git/objects/71/e6b43e9d41f9903992fd86d483b7d3e4dd28cd +0 -0
  57. data/.git/objects/75/d0b250bcdf241d981313b1d6eb153b96e4b05f +2 -0
  58. data/.git/objects/7d/978ee312ca2119dc84e40431182b8f68e42f53 +1 -0
  59. data/.git/objects/87/fc827fd223cac6b4e55d823a9ea86bb0726a3b +0 -0
  60. data/.git/objects/8d/4dcde8df4da8f53f5f5313757b907e9aa1af66 +0 -0
  61. data/.git/objects/8e/69b6cf3ec8b49270091b4a206ccf326679dc20 +0 -0
  62. data/.git/objects/92/e1c250edfca72ed0932934257ef3cfc7122ec5 +0 -0
  63. data/.git/objects/92/e1f3936e7c33007d0a466b836804450992a1eb +1 -0
  64. data/.git/objects/93/f9a6b596879347290cde161b03052bb22021de +5 -0
  65. data/.git/objects/94/72f3ac9e890231482aadd774bdc1c9ba742497 +0 -0
  66. data/.git/objects/a7/6c4944dc009628cb65b4962464a8eb484d6a71 +0 -0
  67. data/.git/objects/ac/92bcf6c74d23824c3c7ce341f667507592c7f9 +0 -0
  68. data/.git/objects/b0/2c48116db702256abf27fab4236c84bd2d2dbc +2 -0
  69. data/.git/objects/b0/39fcd38009980eb74d6bcef22d11e02639a530 +0 -0
  70. data/.git/objects/b2/cd852090540d0b2450b901397edd924d8c0ba9 +0 -0
  71. data/.git/objects/b4/228251babf3a84ac181d462fdd383816bd23b8 +0 -0
  72. data/.git/objects/b5/edd343ceb8e87d1a73922612aec210b393f839 +0 -0
  73. data/.git/objects/bb/23236d2e8340087cc495c66310e6eb90d6fe0a +0 -0
  74. data/.git/objects/bc/90a06dd2f2257e8da49989738db5747e2b78d8 +4 -0
  75. data/.git/objects/bd/eab0ec8a914cdd8c9341340191c116a4bf2d3e +0 -0
  76. data/.git/objects/c0/724bc45e241d336d6376f14d9b258c2e4744d4 +0 -0
  77. data/.git/objects/c1/3cf3c2ea85ec40544fe31702b2cfe6091aed6e +0 -0
  78. data/.git/objects/c5/64ac68ebc8e0db7a6355a45f3299829ef2a825 +0 -0
  79. data/.git/objects/ca/c13b06411cdb70ac35d51ecf9efb0907645bd1 +0 -0
  80. data/.git/objects/d1/38a420782e818f3f87c6c8c0a0a135639a30d9 +0 -0
  81. data/.git/objects/d2/85be6e2891e063625d4904c9bcca42bf6f0b83 +0 -0
  82. data/.git/objects/d4/1e2336bcd3ce3d09a9fa6c3af3270c29bd8457 +1 -0
  83. data/.git/objects/d5/86dc7698c6ec37db86e9f36a16bd671e0005ab +0 -0
  84. data/.git/objects/d5/a2b441718a88aa08fa937352a6d80319bc91c0 +0 -0
  85. data/.git/objects/e0/d8e7ab5a565d95d44f2a9a6246be6003a3de7b +0 -0
  86. data/.git/objects/e2/bc2615d3aa154bba2897c562a15ed19136d518 +0 -0
  87. data/.git/objects/e3/a7cacb84225125a2bc91b42394e7de7de7b205 +0 -0
  88. data/.git/objects/e3/cde2715e3e3870a5d7312cac9bbf6e24259e0f +0 -0
  89. data/.git/objects/e4/d7cacac2d7e66df5a7c21eaae71c0a90f1439d +0 -0
  90. data/.git/objects/e7/f4b26a3258b7788ffe2665773387e19c01095a +3 -0
  91. data/.git/objects/ea/50407bf8daef694d22268540dd55eb3a739bad +4 -0
  92. data/.git/objects/eb/9701e2dbe8fb606315f9514d789188160bdd67 +2 -0
  93. data/.git/objects/ee/ccaf0d272346a1dcc672a4131ba692a0027049 +2 -0
  94. data/.git/objects/f2/196f15b2d432b2a2d641aed4ae5afe7190edb9 +1 -0
  95. data/.git/objects/f3/3573a82a9e7dbf9bc7f5b3feded4c223701d1f +0 -0
  96. data/.git/objects/f3/7784042bc99c16c02fd104dda82aafa42d4c9c +0 -0
  97. data/.git/objects/f5/91a5c39e03e2102c9101db957b48c8c76e194c +0 -0
  98. data/.git/objects/f9/8d0f95460a7a3f63ab4c08ad5508fd32d1b5c2 +0 -0
  99. data/.git/objects/pack/pack-c7edd4d292858ed6a37a55c1b6ceb35f65f4587e.idx +0 -0
  100. data/.git/objects/pack/pack-c7edd4d292858ed6a37a55c1b6ceb35f65f4587e.pack +0 -0
  101. data/.git/packed-refs +2 -0
  102. data/.git/refs/heads/master +1 -0
  103. data/.git/refs/remotes/origin/HEAD +1 -0
  104. data/.git/refs/remotes/origin/master +1 -0
  105. data/.gitignore +5 -0
  106. data/README.rdoc +14 -0
  107. data/Rakefile +63 -0
  108. data/lib/rails_ext/action_controller.rb +19 -0
  109. data/lib/rails_ext/action_controller_ext.rb +29 -0
  110. data/lib/rails_ext/action_view.rb +5 -0
  111. data/lib/rails_ext/active_record.rb +7 -0
  112. data/lib/rails_ext/active_record_ext.rb +15 -0
  113. data/lib/rails_ext/basic.rb +7 -0
  114. data/lib/rails_ext/common_helper.rb +83 -0
  115. data/lib/rails_ext/config_files/safe_hash.rb +96 -0
  116. data/lib/rails_ext/config_files.rb +18 -0
  117. data/lib/rails_ext/create_public_symlinks.rb +9 -0
  118. data/lib/rails_ext/defer_javascript.rb +51 -0
  119. data/lib/rails_ext/email_config.rb +8 -0
  120. data/lib/rails_ext/global_path_prefix.rb +56 -0
  121. data/lib/rails_ext/hacks/ajax_flash.rb +9 -0
  122. data/lib/rails_ext/hacks/ajax_redirect_to.rb +19 -0
  123. data/lib/rails_ext/hacks/defer_javascript.rb +17 -0
  124. data/lib/rails_ext/hacks/global_path_prefix.rb +33 -0
  125. data/lib/rails_ext/hacks/link_to.rb +106 -0
  126. data/lib/rails_ext/hacks/merge_default_scope.rb +20 -0
  127. data/lib/rails_ext/hacks/persistent_params.rb +16 -0
  128. data/lib/rails_ext/hacks/rjs_layout.rb +2 -0
  129. data/lib/rails_ext/handy_environment.rb +45 -0
  130. data/lib/rails_ext/i18n_helper.rb +125 -0
  131. data/lib/rails_ext/merge_default_scope/hash_poser.rb +40 -0
  132. data/lib/rails_ext/merge_default_scope.rb +16 -0
  133. data/lib/rails_ext/model.rb +1 -0
  134. data/lib/rails_ext/persistent_params.rb +88 -0
  135. data/lib/rails_ext/redirect_helper.rb +14 -0
  136. data/lib/rails_ext/reload_page.rb +7 -0
  137. data/lib/rails_ext/user_error.rb +12 -0
  138. data/lib/rails_ext.rb +21 -0
  139. data/spec/safe_hash_spec.rb +71 -0
  140. data/spec/spec.opts +3 -0
  141. metadata +203 -0
@@ -0,0 +1,2 @@
1
+ x%̱
2
+ �0`g���E��fjWG+]å���5'��طWp���h���N4�h%�]7�E3�o�q�-j�"�s�/aC[��g7 ��ߜ#�/��\���c旬��g
@@ -0,0 +1 @@
1
+ x}�AK�@�=�+�E��B�� 1�x�B�T[���.��M+*��N6��������o0�����[��V�܁�l�`/ρ�Z��\F��t��u����o˗œ^�Ϗ��l]�S�U+��=�����z5�@�W�;�l����B�l��w�-����r�-�(��A!��!yg�Y�_�O��C�-y� 2�c�Z�{�����Q2[�i�OR��� �H��=Wm�
@@ -0,0 +1 @@
1
+ xm�A� DѮs��X�B�1ӂB�I��W�{=o~j=�����]kP���[��,��2�RH���>;�Pƛ�6ɤ��Vht��\X���՞���N�
@@ -0,0 +1,5 @@
1
+ x}�A��@ �=�xֳv^��AA���0��8��C3BE�ߝZ�
2
+ IxɃ凜k���ߤ�ڛ0
3
+ �D�]�*1�X��,u��5��Md
4
+ �R\Ezo���N_>�2Y�b��ι �[
5
+ &����[��iD��aK�/�|��h�|�.fo� � ����T���#A��A&s_+f���>�7���۔:��OrqZ�
@@ -0,0 +1,2 @@
1
+ xuQ�J�@ ���"�C�z���,�vڍ�ۭɶU�޽{�z�����0�������N񹈂e���UZ�Err>��9Fhs��Z���
2
+ ��Y��GQ� �p�-�������W6�2�]��~�������9��q_�+���K�;�>EI�U�=���P��5i��׺b�a&]�ш=Hi�:��c}��D(=�L�|\z��_�KK4�e�D���s bu�#E.z�|�q]�ߓ �s-��F��
@@ -0,0 +1,4 @@
1
+ x}�Ak�@�=�+ɭ�h{sA4��
2
+ ړU���q;�Ҋ��KO�03� o�{eӖx�<
3
+ ��g^�k�7敄s��a\C"�����C`�^-vY��a�Ѯ���ȶv�ߌ���i��X�s��G[{��_6�(3̐�czn���9?�Q�
4
+ _$z_�k����SkڳS(�o�s,�FT�s�X����:r�Z���a�4����`l
@@ -0,0 +1 @@
1
+ xu�1�0 ��t)���h�&� <�Q��v�nn�e��xP<���e�FxבC��R(kՒ3t��S���7�A�Pt:O��\(J����ؒk�E}ق�+�lAe��z�����ý}�����K�t^)!o��R�}b
@@ -0,0 +1,3 @@
1
+ x]�1O�0���+�ĒH(K��
2
+ &����"׾�cG�P�����R������޻���ryw�7j��0tP߮�Y�F��Jkj:���ɋg��3���)��Th��k:+@�X�����޴�����I�nS�
3
+ �"61.<�H/L��&<�"��o9 �#�Œ!��R e�6���Z��Mt�����9���gN��R��:�a*�����&o�xF^J\X�!�Yy@i��:��ߣ<X���iz����1���)xc;<G,���������R��*�~��8
@@ -0,0 +1,4 @@
1
+ xuRMo�@�ٿb�T
2
+ ,9��!B�M�H�H$�|Pk��M�]˻i>���3kC��k<3���{N�M���ˇ#�f���4/`���H�<�7$^6r� ��IfM�
3
+ ȭ�Tq�[��svy<8OʯA[�$�fv9OaPaYr�]aN���"��*8��h��]̯��bq��M�(�w<��*Q��>/��� 2D�0�"޻��9�I��o,��߷#�%zL�ѡÕ�#^��jM����\V5,��Bz��h:B�&O�ʷu�P
4
+ N�:/��SL~���u6�=MV�V� |�!�{L��/A�7h�� �l
@@ -0,0 +1,2 @@
1
+ x��M
2
+ � @�=��BqF���etFH� ���9A7�����Lݢ�S�U-���s%���C��,�R(R�R�0P2���v��ƾ
@@ -0,0 +1,2 @@
1
+ x���
2
+ �0E;�+���M�kgAp��%xO���d���p8�������*&��E���x纳������l5^%��]DH\ nU�+O,�e�OV��woPE��T���>?��uB'
@@ -0,0 +1 @@
1
+ xm���0 C���n{���ɹ�B �)v(|>�1�q^-�Is��p� �t�B�2�P�*%g�ǫ����2���� B��}߄8�v�9��G��^)�'���`[�ނM���V� �T59��U{�k!qkU������i� y��7�v�
data/.git/packed-refs ADDED
@@ -0,0 +1,2 @@
1
+ # pack-refs with: peeled
2
+ 12d80c4654e692f2668f41cb86897e77d1bcaf4a refs/remotes/origin/master
@@ -0,0 +1 @@
1
+ 29b1f8abaed4aea1da8f8bd5f1bd81c26058c41a
@@ -0,0 +1 @@
1
+ ref: refs/remotes/origin/master
@@ -0,0 +1 @@
1
+ 29b1f8abaed4aea1da8f8bd5f1bd81c26058c41a
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *~
2
+ .DS_Store
3
+ .idea
4
+ .idea/**/*
5
+ Thumbs.db
data/README.rdoc ADDED
@@ -0,0 +1,14 @@
1
+ 4
2
+ RailsCommons
3
+ ============
4
+
5
+ Introduction goes here.
6
+
7
+
8
+ Example
9
+ =======
10
+
11
+ Example goes here.
12
+
13
+
14
+ Copyright (c) 2009 [name of plugin creator], released under the MIT license
data/Rakefile ADDED
@@ -0,0 +1,63 @@
1
+ require 'rake'
2
+ require 'spec/rake/spectask'
3
+
4
+ Dir.chdir File.dirname(__FILE__)
5
+
6
+ # Specs
7
+ task :default => :spec
8
+
9
+ Spec::Rake::SpecTask.new('spec') do |t|
10
+ t.spec_files = FileList["spec/**/*_spec.rb"]
11
+ t.libs = ["lib", "spec"]
12
+ end
13
+
14
+ # Gem
15
+ require 'rake/clean'
16
+ require 'rake/gempackagetask'
17
+ require 'fileutils'
18
+
19
+ spec = Gem::Specification.new do |s|
20
+ s.name = "rails-ext"
21
+ s.version = "0.2.0"
22
+ s.summary = "Set of common Ruby on Rails extensions"
23
+ s.description = "Set of common Ruby on Rails extensions"
24
+ s.author = "Alexey Petrushin"
25
+ # s.email = ""
26
+ s.homepage = "http://www.bos-tec.com"
27
+
28
+ s.platform = Gem::Platform::RUBY
29
+ s.has_rdoc = true
30
+ s.extra_rdoc_files = ["README.rdoc"]
31
+
32
+ s.files = (%w{Rakefile README.rdoc .gitignore} + Dir.glob("{lib,spec,.git}/**/*"))
33
+ # s.executables = ['restclient']
34
+ # s.add_dependency("BlueCloth", ">= 0.0.4")
35
+ s.add_dependency "ruby-ext"
36
+
37
+ s.require_path = "lib"
38
+ end
39
+
40
+ PACKAGE_DIR = "#{File.expand_path File.dirname(__FILE__)}/build"
41
+
42
+ Rake::GemPackageTask.new(spec) do |p|
43
+ package_dir = PACKAGE_DIR
44
+ # FileUtils.mkdir package_dir unless File.exist? package_dir
45
+ p.need_tar = true if RUBY_PLATFORM !~ /mswin/
46
+ p.need_zip = true
47
+ p.package_dir = package_dir
48
+ end
49
+
50
+ # CLEAN.include [ 'pkg', '*.gem']
51
+
52
+ task :push do
53
+ dir = Dir.chdir PACKAGE_DIR do
54
+ gem_file = Dir.glob("rails-ext*.gem").first
55
+ system "gem push #{gem_file}"
56
+ end
57
+ end
58
+
59
+ task :clean do
60
+ system "rm -r #{PACKAGE_DIR}"
61
+ end
62
+
63
+ task :release => [:gem, :push, :clean]
@@ -0,0 +1,19 @@
1
+ require 'rails_ext/basic'
2
+
3
+ require 'rails_ext/action_controller_ext'
4
+
5
+ require 'rails_ext/global_path_prefix'
6
+ require 'rails_ext/hacks/global_path_prefix'
7
+
8
+ require 'rails_ext/hacks/link_to'
9
+
10
+ require 'rails_ext/hacks/ajax_flash'
11
+
12
+ require 'rails_ext/hacks/ajax_redirect_to'
13
+
14
+ require 'rails_ext/persistent_params'
15
+ require 'rails_ext/hacks/persistent_params'
16
+
17
+ require 'rails_ext/redirect_helper'
18
+
19
+ require 'rails_ext/reload_page'
@@ -0,0 +1,29 @@
1
+ #
2
+ # url_for, used to generate url_for for string path with options and with default_url_options
3
+ #
4
+ ActionController::Base.class_eval do
5
+ protected
6
+ def url_for_path path, options = {}
7
+ unless options.delete :no_prefix
8
+ url = ActionController::Base.relative_url_root + path
9
+ else
10
+ url = path
11
+ end
12
+ options = options.merge default_url_options
13
+ url << "?#{options.to_query}" unless options.empty?
14
+ url._url_format = options[:format] if options[:format] # for links with ajax support
15
+ url
16
+ end
17
+
18
+ def catch_user_error
19
+ begin
20
+ yield
21
+ rescue UserError => e
22
+ flash[:error] = e.message
23
+ do_not_persist_params do
24
+ redirect_to default_path
25
+ end
26
+ end
27
+ end
28
+ around_filter :catch_user_error
29
+ end
@@ -0,0 +1,5 @@
1
+ require 'rails_ext/basic'
2
+
3
+ require 'rails_ext/common_helper'
4
+
5
+ require 'rails_ext/hacks/rjs_layout'
@@ -0,0 +1,7 @@
1
+ require 'rails_ext/basic'
2
+
3
+ require 'rails_ext/active_record_ext'
4
+
5
+ require 'rails_ext/merge_default_scope/hash_poser'
6
+ require 'rails_ext/hacks/merge_default_scope'
7
+ require 'rails_ext/merge_default_scope'
@@ -0,0 +1,15 @@
1
+ if defined?(ActiveRecord)
2
+ ActiveRecord::Base.send :class_eval do
3
+ # STRONG_NAME = /\A[a-zA-Z_][a-zA-Z_0-9]*\Z/
4
+
5
+ def dom_id
6
+ new_record? ? "new_#{self.class.name.underscore}" : "#{self.class.name.underscore}_#{id}"
7
+ end
8
+
9
+
10
+ #
11
+ # handy accessor for @attributes_cache
12
+ #
13
+ attr_reader :attributes_cache
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ require 'ruby_ext'
2
+
3
+ require 'activesupport'
4
+
5
+ require 'rails_ext/handy_environment'
6
+
7
+ require 'rails_ext/user_error'
@@ -0,0 +1,83 @@
1
+ module CommonHelper
2
+ # Initialize JavaScripts variables, needed to rails_ext.js works properly.
3
+ def initialize_js_commons
4
+ javascript_tag %{\
5
+ $.authenticity_token = "#{form_authenticity_token}";}
6
+ end
7
+
8
+ # Prepends content to 'content_for'
9
+ def prepend_to name, content = nil, &block
10
+ ivar = "@content_for_#{name}"
11
+ content = capture(&block) if block_given?
12
+ content ||= ""
13
+ stored_content = instance_variable_get(ivar) || ""
14
+ instance_variable_set(ivar, content + stored_content)
15
+ nil
16
+ end
17
+
18
+ # Wraps content for 'content_for'
19
+ def wrap_content_for name, &block
20
+ block.should_not! :be_nil
21
+
22
+ ivar = "@content_for_#{name}"
23
+ content = capture(instance_variable_get(ivar) || "", &block)
24
+ instance_variable_set(ivar, content || "")
25
+ nil
26
+ end
27
+
28
+ # Has content for 'content_for'
29
+ def has_content_for? name
30
+ ivar = "@content_for_#{name}"
31
+ !instance_variable_get(ivar).blank?
32
+ end
33
+
34
+ # Escape JS
35
+ def js *args, &block
36
+ escape_javascript *args, &block
37
+ end
38
+
39
+ # def autohide
40
+ # # request.format == Mime::JS ? 'hidden' : ''
41
+ # Thread.current[:autohide] ? 'hidden' : ''
42
+ # end
43
+ #
44
+ # def render_hidden *args, &block
45
+ # begin
46
+ # Thread.current[:autohide] = true
47
+ # render *args, &block
48
+ # ensure
49
+ # Thread.current[:autohide] = false
50
+ # end
51
+ # end
52
+
53
+ def tidy_html html
54
+ require 'tidy'
55
+
56
+ Tidy.path = '/usr/lib/libtidy.dylib' # depends on platform!
57
+ options = {
58
+ :indent => true,
59
+ :char_encoding => 'utf8',
60
+ :wrap => 0,
61
+ :output_xhtml => true,
62
+ :show_errors => 6,
63
+ :show_warnings => true,
64
+ :tab_size => 2,
65
+ :vertical_space => true,
66
+ :new_inline_tags => "script"
67
+ }
68
+
69
+ Tidy.open options do |tidy|
70
+ xml = tidy.clean(html)
71
+
72
+ # puts " Tidy Messages:"
73
+ # puts tidy.errors
74
+ # puts tidy.diagnostics
75
+ # puts
76
+
77
+ # xml.gsub(">\n</script>", "></script>") # tidy makes it newline
78
+ xml
79
+ end
80
+ end
81
+ end
82
+
83
+ ActionController::Base.send :helper, CommonHelper
@@ -0,0 +1,96 @@
1
+ require 'singleton'
2
+
3
+ class SafeHash < BlankSlate
4
+ attr_reader :hash
5
+
6
+ def initialize hash = {}
7
+ reinitialize hash
8
+ end
9
+
10
+ def []= key, value
11
+ value = SafeHash.new value if value.is_a? Hash
12
+ @hash[key.to_s] = value
13
+ end
14
+
15
+ def include? key
16
+ @hash.include? key.to_s
17
+ end
18
+
19
+ def [] key, *args
20
+ key = key.to_s
21
+ if key.last == '!'
22
+ key = key[0..key.size-2]
23
+ if (result = @hash[key]).eql? nil
24
+ raise "No key #{key}"
25
+ else
26
+ result
27
+ end
28
+ elsif key.last == '?'
29
+ key = key[0..key.size-2]
30
+ @hash.include? key
31
+ elsif (result = @hash[key]).eql? nil
32
+ if args.empty?
33
+ SafeNil.instance
34
+ else
35
+ return *args
36
+ end
37
+ else
38
+ result
39
+ end
40
+ end
41
+
42
+ def reinitialize hash
43
+ @hash = {}
44
+ hash.each do |k, v|
45
+ v = SafeHash.new v if v.is_a? Hash
46
+ @hash[k.to_s] = v
47
+ end
48
+ # @hash.freeze
49
+ end
50
+
51
+ def method_missing m, *args
52
+ self[m, *args]
53
+ end
54
+
55
+ def to_yaml *args
56
+ @hash.to_yaml *args
57
+ end
58
+
59
+ def inspect
60
+ @hash.inspect
61
+ end
62
+
63
+ class SafeNil < BlankSlate
64
+ include Singleton
65
+
66
+ def [] key, *args
67
+ if key.to_s.last == '!'
68
+ raise "No key #{key}"
69
+ elsif args.empty?
70
+ SafeNil.instance
71
+ else
72
+ return *args
73
+ end
74
+ end
75
+
76
+ def method_missing m, *args
77
+ self[m, *args]
78
+ end
79
+
80
+ def include? key
81
+ false
82
+ end
83
+
84
+ def to_b
85
+ false
86
+ end
87
+
88
+ def to_yaml *args
89
+ nil
90
+ end
91
+
92
+ def inspect
93
+ nil
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,18 @@
1
+ # Converts any non standart fname.yml file in /config folder into FNAME constant with loaded YAML content wrapped into SafeHash.
2
+ config_dir = "#{RAILS_ROOT}/config/"
3
+ files = Dir.glob("#{config_dir}*.yml")
4
+ ignore = ["asset_packages\\.yml", "database\\.yml", "\\..+\\."].collect{|expr| Regexp.new expr}
5
+ files.delete_if{|fname| ignore.any?{|template| template =~ fname}}
6
+ files.delete_if{|fname| /^[a-zA-Z0-9_]+\.yml$/ !~ fname.sub(config_dir, '')}
7
+
8
+ files.each do |fname|
9
+ const = fname.sub(config_dir, '').sub('.yml', '').upcase
10
+
11
+ setting = if (data = YAML.load_file(fname)).is_a? Hash
12
+ SafeHash.new data
13
+ else
14
+ data
15
+ end
16
+
17
+ Object.const_set const, setting
18
+ end
@@ -0,0 +1,9 @@
1
+ module RailsExt
2
+ class << self
3
+ def create_public_symlinks!
4
+ re_dir = File.expand_path "#{File.dirname __FILE__}/../../public/rails_ext"
5
+ app_dir = File.expand_path "#{RAILS_ROOT}/public/rails_ext"
6
+ system "ln -nfs #{re_dir} #{app_dir}"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,51 @@
1
+ ActionController::Base.class_eval do
2
+ def self.defer_scripts
3
+ before_filter :defer_scripts
4
+ end
5
+
6
+ def defer_scripts
7
+ Thread.current[:deferred_scripts_called] = false
8
+ Thread.current[:defer_scripts] = request.xhr? ? false : true
9
+ end
10
+
11
+ def self.defer_scripts?
12
+ !!Thread.current[:defer_scripts]
13
+ end
14
+ end
15
+
16
+ ActionView::Base.class_eval do
17
+ def defer_scripts?
18
+ ActionController::Base.defer_scripts?
19
+ end
20
+
21
+ def initialize_deferred_scripts
22
+ return "" unless defer_scripts?
23
+ not_deferred_script do
24
+ javascript_tag "var deferred = [];"
25
+ end
26
+ end
27
+
28
+ def not_deferred_script &block
29
+ before = Thread.current[:defer_scripts]
30
+ begin
31
+ Thread.current[:defer_scripts] = false
32
+ block.call
33
+ ensure
34
+ Thread.current[:defer_scripts] = before
35
+ end
36
+ end
37
+
38
+ def call_deferred_scripts
39
+ return "" unless defer_scripts?
40
+ Thread.current[:deferred_scripts_called] = true
41
+ content = <<END
42
+ $.each(deferred, function(){this()});
43
+ $('._deferred').show();
44
+ deferred = [];
45
+ END
46
+ not_deferred_script do
47
+ javascript_tag content
48
+ end
49
+ end
50
+
51
+ end
@@ -0,0 +1,8 @@
1
+ # Load mail configuration if not in test environment
2
+ if RAILS_ENV != 'test'
3
+ filename = "#{RAILS_ROOT}/config/email.yml"
4
+ if File.exist? filename
5
+ email_settings = YAML::load(File.open(filename))
6
+ ActionMailer::Base.smtp_settings = email_settings[RAILS_ENV] unless email_settings[RAILS_ENV].nil?
7
+ end
8
+ end