rails-ext 0.2.0

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