rails-ext 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.git/COMMIT_EDITMSG +1 -0
- data/.git/HEAD +1 -0
- data/.git/config +12 -0
- data/.git/description +1 -0
- data/.git/hooks/applypatch-msg.sample +15 -0
- data/.git/hooks/commit-msg.sample +24 -0
- data/.git/hooks/post-commit.sample +8 -0
- data/.git/hooks/post-receive.sample +15 -0
- data/.git/hooks/post-update.sample +8 -0
- data/.git/hooks/pre-applypatch.sample +14 -0
- data/.git/hooks/pre-commit.sample +46 -0
- data/.git/hooks/pre-rebase.sample +169 -0
- data/.git/hooks/prepare-commit-msg.sample +36 -0
- data/.git/hooks/update.sample +128 -0
- data/.git/index +0 -0
- data/.git/info/exclude +6 -0
- data/.git/logs/HEAD +6 -0
- data/.git/logs/refs/heads/master +6 -0
- data/.git/logs/refs/remotes/origin/master +5 -0
- data/.git/objects/02/469b717b4bd61ad27a3fe664ce0646a8325399 +2 -0
- data/.git/objects/06/c3225bad9d5b80e7b3bde79ff3c2da591722bf +5 -0
- data/.git/objects/07/f7d26527e58caa2fa99e33b29a7791b9eb8b3e +0 -0
- data/.git/objects/09/20505d42c0044b31ff7b1f86cec6e282e13414 +0 -0
- data/.git/objects/0b/e101a0586410212b4ee5905881ad726b7b4907 +0 -0
- data/.git/objects/10/bfe1230b9d96e23600091cc8b4b9d378068101 +0 -0
- data/.git/objects/13/882df4f2ef911454bf3b69a85742b372723366 +2 -0
- data/.git/objects/15/3f845625a0f605a2a35487a32038d0349bc386 +0 -0
- data/.git/objects/18/77033b90ed3dd55a3034b7e3ca1c5c9f66868d +0 -0
- data/.git/objects/19/1f68644a3646d774f2546c4cd49ac7d66f4cc2 +0 -0
- data/.git/objects/1d/d49713de2942dc974e55adc3684f55b2b817e2 +0 -0
- data/.git/objects/1e/6374b23c71a07b0e414e80912fd45503bd3daf +0 -0
- data/.git/objects/29/7a2c413b11f78b69dd8caa4f334c9536088f8a +3 -0
- data/.git/objects/29/b1f8abaed4aea1da8f8bd5f1bd81c26058c41a +3 -0
- data/.git/objects/2a/04524c8458b2d0cd9bcec579f9d54368a9d35f +0 -0
- data/.git/objects/2d/043376f1bc26b2dad3e79fc72ea14341ea437d +0 -0
- data/.git/objects/2e/3e3fc8e46949a9b944da3c36207c444aa2c9b7 +0 -0
- data/.git/objects/30/69d4978bbdfacf4402c4339438b29657275f2c +0 -0
- data/.git/objects/36/9902ca51d5820a02ccccbf1cac6ed09051941d +0 -0
- data/.git/objects/3a/03b9d44de43472689300120ffb2a0a9a74f27f +0 -0
- data/.git/objects/3a/797683953be7e6d0ffa0e34514f3e8e9c3ceb0 +3 -0
- data/.git/objects/3f/3db6bb5a5204ae58e303959c4c0da3a70d8b35 +1 -0
- data/.git/objects/40/215c0554202fc46dc2fca94ed21e2920ce1e84 +0 -0
- data/.git/objects/4b/2bdb2dc6330ba9bafd9058ec8eaa925ef53f91 +0 -0
- data/.git/objects/4d/991a018b0c697fa119efe7aaf55df0a1c7af8e +0 -0
- data/.git/objects/4f/fa8f1c9b7e3fdbb23ab600722d1011dcb48cec +2 -0
- data/.git/objects/55/d1f1efc344266d472094b1fd2f247b97de1c8b +0 -0
- data/.git/objects/57/8a722fd66124331e07123e3a0de2b6b50a581b +3 -0
- data/.git/objects/59/0ef6ba9931d75fbddc7a940044dbaaa50efc76 +0 -0
- data/.git/objects/5a/35fa85474278f3c817aa59d07b725428c41a28 +0 -0
- data/.git/objects/60/a681e873ca0ae0b7da3f37dbc5701f6e42b970 +1 -0
- data/.git/objects/61/32f3f8005ce5b88165162ac5542e54d0472a82 +3 -0
- data/.git/objects/65/51094fa3b996ff25b88d7ddb21d21a811d53fc +2 -0
- data/.git/objects/67/850cf1ede94d80c9b07ceace074a4d62f15249 +0 -0
- data/.git/objects/68/8ce506ac4f7c160bd6880d8507820761a3b3b7 +0 -0
- data/.git/objects/6d/f725e3519872a75bc763045f00d8844eb890cf +0 -0
- data/.git/objects/71/e6b43e9d41f9903992fd86d483b7d3e4dd28cd +0 -0
- data/.git/objects/75/d0b250bcdf241d981313b1d6eb153b96e4b05f +2 -0
- data/.git/objects/7d/978ee312ca2119dc84e40431182b8f68e42f53 +1 -0
- data/.git/objects/87/fc827fd223cac6b4e55d823a9ea86bb0726a3b +0 -0
- data/.git/objects/8d/4dcde8df4da8f53f5f5313757b907e9aa1af66 +0 -0
- data/.git/objects/8e/69b6cf3ec8b49270091b4a206ccf326679dc20 +0 -0
- data/.git/objects/92/e1c250edfca72ed0932934257ef3cfc7122ec5 +0 -0
- data/.git/objects/92/e1f3936e7c33007d0a466b836804450992a1eb +1 -0
- data/.git/objects/93/f9a6b596879347290cde161b03052bb22021de +5 -0
- data/.git/objects/94/72f3ac9e890231482aadd774bdc1c9ba742497 +0 -0
- data/.git/objects/a7/6c4944dc009628cb65b4962464a8eb484d6a71 +0 -0
- data/.git/objects/ac/92bcf6c74d23824c3c7ce341f667507592c7f9 +0 -0
- data/.git/objects/b0/2c48116db702256abf27fab4236c84bd2d2dbc +2 -0
- data/.git/objects/b0/39fcd38009980eb74d6bcef22d11e02639a530 +0 -0
- data/.git/objects/b2/cd852090540d0b2450b901397edd924d8c0ba9 +0 -0
- data/.git/objects/b4/228251babf3a84ac181d462fdd383816bd23b8 +0 -0
- data/.git/objects/b5/edd343ceb8e87d1a73922612aec210b393f839 +0 -0
- data/.git/objects/bb/23236d2e8340087cc495c66310e6eb90d6fe0a +0 -0
- data/.git/objects/bc/90a06dd2f2257e8da49989738db5747e2b78d8 +4 -0
- data/.git/objects/bd/eab0ec8a914cdd8c9341340191c116a4bf2d3e +0 -0
- data/.git/objects/c0/724bc45e241d336d6376f14d9b258c2e4744d4 +0 -0
- data/.git/objects/c1/3cf3c2ea85ec40544fe31702b2cfe6091aed6e +0 -0
- data/.git/objects/c5/64ac68ebc8e0db7a6355a45f3299829ef2a825 +0 -0
- data/.git/objects/ca/c13b06411cdb70ac35d51ecf9efb0907645bd1 +0 -0
- data/.git/objects/d1/38a420782e818f3f87c6c8c0a0a135639a30d9 +0 -0
- data/.git/objects/d2/85be6e2891e063625d4904c9bcca42bf6f0b83 +0 -0
- data/.git/objects/d4/1e2336bcd3ce3d09a9fa6c3af3270c29bd8457 +1 -0
- data/.git/objects/d5/86dc7698c6ec37db86e9f36a16bd671e0005ab +0 -0
- data/.git/objects/d5/a2b441718a88aa08fa937352a6d80319bc91c0 +0 -0
- data/.git/objects/e0/d8e7ab5a565d95d44f2a9a6246be6003a3de7b +0 -0
- data/.git/objects/e2/bc2615d3aa154bba2897c562a15ed19136d518 +0 -0
- data/.git/objects/e3/a7cacb84225125a2bc91b42394e7de7de7b205 +0 -0
- data/.git/objects/e3/cde2715e3e3870a5d7312cac9bbf6e24259e0f +0 -0
- data/.git/objects/e4/d7cacac2d7e66df5a7c21eaae71c0a90f1439d +0 -0
- data/.git/objects/e7/f4b26a3258b7788ffe2665773387e19c01095a +3 -0
- data/.git/objects/ea/50407bf8daef694d22268540dd55eb3a739bad +4 -0
- data/.git/objects/eb/9701e2dbe8fb606315f9514d789188160bdd67 +2 -0
- data/.git/objects/ee/ccaf0d272346a1dcc672a4131ba692a0027049 +2 -0
- data/.git/objects/f2/196f15b2d432b2a2d641aed4ae5afe7190edb9 +1 -0
- data/.git/objects/f3/3573a82a9e7dbf9bc7f5b3feded4c223701d1f +0 -0
- data/.git/objects/f3/7784042bc99c16c02fd104dda82aafa42d4c9c +0 -0
- data/.git/objects/f5/91a5c39e03e2102c9101db957b48c8c76e194c +0 -0
- data/.git/objects/f9/8d0f95460a7a3f63ab4c08ad5508fd32d1b5c2 +0 -0
- data/.git/objects/pack/pack-c7edd4d292858ed6a37a55c1b6ceb35f65f4587e.idx +0 -0
- data/.git/objects/pack/pack-c7edd4d292858ed6a37a55c1b6ceb35f65f4587e.pack +0 -0
- data/.git/packed-refs +2 -0
- data/.git/refs/heads/master +1 -0
- data/.git/refs/remotes/origin/HEAD +1 -0
- data/.git/refs/remotes/origin/master +1 -0
- data/.gitignore +5 -0
- data/README.rdoc +14 -0
- data/Rakefile +63 -0
- data/lib/rails_ext/action_controller.rb +19 -0
- data/lib/rails_ext/action_controller_ext.rb +29 -0
- data/lib/rails_ext/action_view.rb +5 -0
- data/lib/rails_ext/active_record.rb +7 -0
- data/lib/rails_ext/active_record_ext.rb +15 -0
- data/lib/rails_ext/basic.rb +7 -0
- data/lib/rails_ext/common_helper.rb +83 -0
- data/lib/rails_ext/config_files/safe_hash.rb +96 -0
- data/lib/rails_ext/config_files.rb +18 -0
- data/lib/rails_ext/create_public_symlinks.rb +9 -0
- data/lib/rails_ext/defer_javascript.rb +51 -0
- data/lib/rails_ext/email_config.rb +8 -0
- data/lib/rails_ext/global_path_prefix.rb +56 -0
- data/lib/rails_ext/hacks/ajax_flash.rb +9 -0
- data/lib/rails_ext/hacks/ajax_redirect_to.rb +19 -0
- data/lib/rails_ext/hacks/defer_javascript.rb +17 -0
- data/lib/rails_ext/hacks/global_path_prefix.rb +33 -0
- data/lib/rails_ext/hacks/link_to.rb +106 -0
- data/lib/rails_ext/hacks/merge_default_scope.rb +20 -0
- data/lib/rails_ext/hacks/persistent_params.rb +16 -0
- data/lib/rails_ext/hacks/rjs_layout.rb +2 -0
- data/lib/rails_ext/handy_environment.rb +45 -0
- data/lib/rails_ext/i18n_helper.rb +125 -0
- data/lib/rails_ext/merge_default_scope/hash_poser.rb +40 -0
- data/lib/rails_ext/merge_default_scope.rb +16 -0
- data/lib/rails_ext/model.rb +1 -0
- data/lib/rails_ext/persistent_params.rb +88 -0
- data/lib/rails_ext/redirect_helper.rb +14 -0
- data/lib/rails_ext/reload_page.rb +7 -0
- data/lib/rails_ext/user_error.rb +12 -0
- data/lib/rails_ext.rb +21 -0
- data/spec/safe_hash_spec.rb +71 -0
- data/spec/spec.opts +3 -0
- metadata +203 -0
Binary file
|
@@ -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�
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
xm�A� DѮs��X�B�1ӂB�I��W�{=o~j=�����]kP���[��,��2�RH���>;�Pƛ�6ɤ��Vht��\X���՞���N�
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -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
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
xm���0C���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�
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/.git/packed-refs
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
29b1f8abaed4aea1da8f8bd5f1bd81c26058c41a
|
@@ -0,0 +1 @@
|
|
1
|
+
ref: refs/remotes/origin/master
|
@@ -0,0 +1 @@
|
|
1
|
+
29b1f8abaed4aea1da8f8bd5f1bd81c26058c41a
|
data/README.rdoc
ADDED
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,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,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,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
|