active_tools 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +0 -0
- data/Gemfile +0 -0
- data/LICENSE.txt +0 -0
- data/README.md +0 -0
- data/Rakefile +0 -0
- data/active_tools.gemspec +2 -2
- data/lib/active_tools/action_pack/action_controller/path_helper.rb +47 -0
- data/lib/active_tools/action_pack/action_controller.rb +8 -0
- data/lib/active_tools/action_pack/action_dispatch/flash_stack.rb +61 -0
- data/lib/active_tools/action_pack/action_dispatch.rb +8 -0
- data/lib/active_tools/action_pack/action_view/tag_attributes.rb +53 -0
- data/lib/active_tools/{actionpack → action_pack}/action_view.rb +1 -1
- data/lib/active_tools/actionpack.rb +3 -1
- data/lib/active_tools/active_model/delegate_attributes.rb +61 -0
- data/lib/active_tools/activemodel.rb +7 -0
- data/lib/active_tools/activesupport.rb +0 -0
- data/lib/active_tools/bundle.rb +19 -6
- data/lib/active_tools/core_extension/deep_copy.rb +7 -3
- data/lib/active_tools/core_extension/deep_merge.rb +3 -1
- data/lib/active_tools/core_extension/hashup.rb +2 -1
- data/lib/active_tools/core_extension/kabuki/crypt.rb +43 -0
- data/lib/active_tools/core_extension/kabuki/dump.rb +31 -0
- data/lib/active_tools/core_extension/kabuki/zip.rb +39 -0
- data/lib/active_tools/core_extension/kabuki.rb +25 -0
- data/lib/active_tools/core_extension/merge_hashup.rb +2 -1
- data/lib/active_tools/core_extension.rb +1 -20
- data/lib/active_tools/engine.rb +0 -0
- data/lib/active_tools/misc/input_source.rb +105 -0
- data/lib/active_tools/misc/script_flow.rb +82 -0
- data/lib/active_tools/misc.rb +9 -0
- data/lib/active_tools/railtie.rb +3 -0
- data/lib/active_tools/version.rb +1 -1
- data/lib/active_tools.rb +0 -0
- metadata +20 -6
- data/lib/active_tools/actionpack/action_view/alt_rendering.rb +0 -10
data/.gitignore
CHANGED
File without changes
|
data/Gemfile
CHANGED
File without changes
|
data/LICENSE.txt
CHANGED
File without changes
|
data/README.md
CHANGED
File without changes
|
data/Rakefile
CHANGED
File without changes
|
data/active_tools.gemspec
CHANGED
@@ -9,8 +9,8 @@ Gem::Specification.new do |gem|
|
|
9
9
|
gem.authors = ["Valery Kvon"]
|
10
10
|
gem.email = ["addagger@gmail.com"]
|
11
11
|
gem.homepage = %q{http://vkvon.ru/projects/active_tools}
|
12
|
-
gem.description = %q{Missing tools for Rails developers
|
13
|
-
gem.summary = %q{ActionDispatch, ActiveRecord, ActiveSupport and
|
12
|
+
gem.description = %q{Missing tools for Rails developers}
|
13
|
+
gem.summary = %q{ActionDispatch, ActionController, ActiveModel, ActiveRecord, ActiveSupport, ActionView and core extensions}
|
14
14
|
|
15
15
|
gem.rubyforge_project = "active_tools"
|
16
16
|
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module ActiveTools
|
2
|
+
module ActionPack
|
3
|
+
module ActionController
|
4
|
+
module PathHelper
|
5
|
+
extend ::ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
helper_method :path?, :action?, :controller?, :current_action, :current_controller
|
9
|
+
end
|
10
|
+
|
11
|
+
def path?(controller, action = nil)
|
12
|
+
controller?(controller) && action?(action)
|
13
|
+
end
|
14
|
+
|
15
|
+
def action?(action)
|
16
|
+
actions = case action
|
17
|
+
when Array then action.collect {|c| c.to_s}
|
18
|
+
when String, Symbol then Array.wrap(action.to_s)
|
19
|
+
else nil
|
20
|
+
end
|
21
|
+
actions.blank? ? true : current_action.in?(actions)
|
22
|
+
end
|
23
|
+
|
24
|
+
def controller?(controller)
|
25
|
+
controllers = case controller
|
26
|
+
when Array then controller.collect {|c| c.to_s}
|
27
|
+
when String, Symbol then Array.wrap(controller.to_s)
|
28
|
+
else nil
|
29
|
+
end
|
30
|
+
controllers.blank? ? true : current_controller.in?(controllers)
|
31
|
+
end
|
32
|
+
|
33
|
+
def current_action
|
34
|
+
request.path_parameters[:action]
|
35
|
+
end
|
36
|
+
|
37
|
+
def current_controller
|
38
|
+
request.path_parameters[:controller]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
module OnLoadActionController
|
45
|
+
include ActionPack::ActionController::PathHelper
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module ActiveTools
|
2
|
+
module ActionPack
|
3
|
+
module ActionDispatch
|
4
|
+
module FlashStack
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
class_eval do
|
9
|
+
def empty?
|
10
|
+
@flashes.empty? && (@stack.nil? ? true : @stack.empty?)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Stack
|
15
|
+
def initialize(flash)
|
16
|
+
@flash = flash
|
17
|
+
@stack = {}
|
18
|
+
end
|
19
|
+
|
20
|
+
def []=(k,v)
|
21
|
+
@stack[k] = Array(v)
|
22
|
+
end
|
23
|
+
|
24
|
+
def [](k)
|
25
|
+
@stack[k] ||= []
|
26
|
+
end
|
27
|
+
|
28
|
+
def method_missing(*args, &block)
|
29
|
+
@stack.send(*args, &block)
|
30
|
+
end
|
31
|
+
|
32
|
+
def use
|
33
|
+
@stack.dup.tap do
|
34
|
+
@stack.clear
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def <<(*hashes)
|
41
|
+
hashes.each do |hash|
|
42
|
+
hash.each do |k,v|
|
43
|
+
Array(v).each do |value|
|
44
|
+
stack[k] << value
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def stack
|
51
|
+
@stack ||= Stack.new(self)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
module OnLoadActiveRecord
|
58
|
+
::ActionDispatch::Flash::FlashHash.send(:include, ActionPack::ActionDispatch::FlashStack)
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module ActiveTools
|
2
|
+
module ActionPack
|
3
|
+
module ActionView
|
4
|
+
module TagAttributes
|
5
|
+
class Collect
|
6
|
+
attr_reader :hash
|
7
|
+
def initialize(hash = nil)
|
8
|
+
@hash = HashWithIndifferentAccess.new {|h,k| h[k] = Array.new}
|
9
|
+
merge(hash) if hash
|
10
|
+
end
|
11
|
+
|
12
|
+
def merge(hash = {})
|
13
|
+
type_valid(hash).each {|key, value| self[key] = value}
|
14
|
+
self
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_s
|
18
|
+
stringify_values.map {|k,v| "#{k}=\"#{v}\"" unless v.blank?}.compact.join(" ").html_safe
|
19
|
+
end
|
20
|
+
|
21
|
+
def [](key)
|
22
|
+
@hash[key]
|
23
|
+
end
|
24
|
+
|
25
|
+
def []=(key, value)
|
26
|
+
@hash[key] += Array[value]
|
27
|
+
end
|
28
|
+
|
29
|
+
def stringify_values
|
30
|
+
Hash[@hash.map {|k,v| [k, v.join(" ")]}]
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def type_valid(object = nil)
|
36
|
+
raise(TypeError, "Hash or nil expected, #{object.class.name} passed.") unless object.is_a?(Hash) || object.nil?
|
37
|
+
object||{}
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
module OnLoadActionView
|
46
|
+
|
47
|
+
def tag_attributes(hash = {})
|
48
|
+
ActionPack::ActionView::TagAttributes::Collect.new(hash)
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module ActiveTools
|
2
|
+
module ActiveModel
|
3
|
+
module DelegateAttributes
|
4
|
+
extend ::ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
class FakeErrors < ::ActiveModel::Errors
|
8
|
+
private
|
9
|
+
def normalize_message(attribute, message, options)
|
10
|
+
message ||= :invalid
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
module ClassMethods
|
17
|
+
def delegate_attributes(*args)
|
18
|
+
options = args.extract_options!
|
19
|
+
errors_option = options.delete(:errors)
|
20
|
+
writer_option = options.delete(:writer)
|
21
|
+
|
22
|
+
writer_regexp = /=\z/
|
23
|
+
readers = args.select {|a| a.to_s !=~ writer_regexp}
|
24
|
+
writers = args.select {|a| a.to_s =~ writer_regexp}
|
25
|
+
if writer_option == true
|
26
|
+
writers += readers.map {|a| "#{a}="}
|
27
|
+
end
|
28
|
+
|
29
|
+
class_eval do
|
30
|
+
delegate *(readers + writers), options.dup
|
31
|
+
end
|
32
|
+
|
33
|
+
unless errors_option == false
|
34
|
+
class_eval <<-EOV
|
35
|
+
validate do
|
36
|
+
object = #{options[:to]}
|
37
|
+
#{"object.instance_variable_set(:@errors, FakeErrors.new(object))" if errors_option.to_s == "fit"}
|
38
|
+
if !object.valid?
|
39
|
+
object.errors.messages.each do |attribute, suberrors|
|
40
|
+
if attribute.to_s.in? %w{#{readers.join(" ")}}
|
41
|
+
suberrors.each do |suberror|
|
42
|
+
errors.add(attribute, suberror)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
EOV
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
module OnLoadActiveRecord
|
58
|
+
::ActiveModel::Validations.send(:include, ActiveModel::DelegateAttributes)
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
File without changes
|
data/lib/active_tools/bundle.rb
CHANGED
@@ -1,8 +1,21 @@
|
|
1
|
-
require 'active_tools/core_extension'
|
2
|
-
require 'active_tools/actionpack'
|
3
|
-
require 'active_tools/activesupport'
|
4
|
-
|
5
1
|
module ActiveTools
|
6
|
-
|
7
|
-
|
2
|
+
module OnLoadActiveRecord
|
3
|
+
extend ::ActiveSupport::Concern
|
4
|
+
end
|
5
|
+
|
6
|
+
module OnLoadActionController
|
7
|
+
extend ::ActiveSupport::Concern
|
8
|
+
end
|
9
|
+
|
10
|
+
module OnLoadActionView
|
11
|
+
extend ::ActiveSupport::Concern
|
12
|
+
end
|
13
|
+
|
14
|
+
module Bundle
|
15
|
+
require 'active_tools/core_extension'
|
16
|
+
require 'active_tools/actionpack'
|
17
|
+
require 'active_tools/activesupport'
|
18
|
+
require 'active_tools/activemodel'
|
19
|
+
require 'active_tools/misc'
|
20
|
+
end
|
8
21
|
end
|
@@ -4,7 +4,7 @@ module ActiveTools
|
|
4
4
|
module DeepCopy
|
5
5
|
# Return the 'deep' brand new copy of Hash, Array or Set. All nested hashes/arrays/sets rebuilded at the same way.
|
6
6
|
|
7
|
-
module
|
7
|
+
module HashExtension
|
8
8
|
def deep_copy(&block)
|
9
9
|
self.class.new.tap do |new_hash|
|
10
10
|
each do |k, v|
|
@@ -18,7 +18,7 @@ module ActiveTools
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
module
|
21
|
+
module ArrayExtension
|
22
22
|
def deep_copy(&block)
|
23
23
|
self.class.new.tap do |new_array|
|
24
24
|
each do |v|
|
@@ -32,7 +32,7 @@ module ActiveTools
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
module
|
35
|
+
module SetExtension
|
36
36
|
def deep_copy(&block)
|
37
37
|
self.class.new.tap do |new_set|
|
38
38
|
each do |v|
|
@@ -46,6 +46,10 @@ module ActiveTools
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
+
::Hash.send(:include, HashExtension)
|
50
|
+
::Array.send(:include, ArrayExtension)
|
51
|
+
::Set.send(:include, SetExtension)
|
52
|
+
|
49
53
|
end
|
50
54
|
end
|
51
55
|
end
|
@@ -3,7 +3,7 @@ module ActiveTools
|
|
3
3
|
|
4
4
|
module DeepMerge
|
5
5
|
|
6
|
-
module
|
6
|
+
module HashExtension
|
7
7
|
# Return the merged Hash with another +hash+, where the possible child hashes are also merged.
|
8
8
|
#
|
9
9
|
# === Example:
|
@@ -30,6 +30,8 @@ module ActiveTools
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
+
::Hash.send(:include, HashExtension)
|
34
|
+
|
33
35
|
end
|
34
36
|
end
|
35
37
|
end
|
@@ -2,7 +2,7 @@ module ActiveTools
|
|
2
2
|
module CoreExtension
|
3
3
|
|
4
4
|
module Hashup
|
5
|
-
module
|
5
|
+
module ArrayExtension
|
6
6
|
# Return a nested Hash object from Array's elements sequence, where elements used as names of +hash+ keys.
|
7
7
|
# The last element of array would be the last nested value.
|
8
8
|
#
|
@@ -23,6 +23,7 @@ module ActiveTools
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
26
|
+
::Array.send(:include, ArrayExtension)
|
26
27
|
end
|
27
28
|
end
|
28
29
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module ActiveTools
|
2
|
+
module CoreExtension
|
3
|
+
|
4
|
+
module Kabuki
|
5
|
+
class Crypt
|
6
|
+
def initialize(string, key = nil)
|
7
|
+
@key = key||Digest::SHA1.hexdigest("yourpass")
|
8
|
+
@string = string
|
9
|
+
end
|
10
|
+
|
11
|
+
def encode
|
12
|
+
c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
|
13
|
+
c.encrypt
|
14
|
+
c.key = @key
|
15
|
+
e = c.update(@string)
|
16
|
+
e << c.final
|
17
|
+
e
|
18
|
+
end
|
19
|
+
|
20
|
+
def decode
|
21
|
+
c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
|
22
|
+
c.decrypt
|
23
|
+
c.key = @key
|
24
|
+
d = c.update(@string)
|
25
|
+
d << c.final
|
26
|
+
d
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
module StringExtension
|
31
|
+
def kabuki_encrypt
|
32
|
+
Kabuki::Crypt.new(self).encode
|
33
|
+
end
|
34
|
+
|
35
|
+
def kabuki_decrypt
|
36
|
+
Kabuki::Crypt.new(self).decode
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
::String.send(:include, StringExtension)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module ActiveTools
|
2
|
+
module CoreExtension
|
3
|
+
|
4
|
+
module Kabuki
|
5
|
+
class Dump
|
6
|
+
def self.encode(object)
|
7
|
+
Marshal.dump(object)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.decode(string)
|
11
|
+
Marshal.load(string)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module ObjectExtension
|
16
|
+
def kabuki_dump
|
17
|
+
Kabuki::Dump.encode(self)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
module StringExtension
|
22
|
+
def kabuki_load
|
23
|
+
Kabuki::Dump.decode(self)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
::Object.send(:include, ObjectExtension)
|
28
|
+
::String.send(:include, StringExtension)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module ActiveTools
|
2
|
+
module CoreExtension
|
3
|
+
|
4
|
+
module Kabuki
|
5
|
+
class Zip
|
6
|
+
def initialize(string)
|
7
|
+
@string = string
|
8
|
+
end
|
9
|
+
|
10
|
+
def compress(level=3)
|
11
|
+
z = Zlib::Deflate.new(level)
|
12
|
+
dst = z.deflate(@string, Zlib::FINISH)
|
13
|
+
z.close
|
14
|
+
dst
|
15
|
+
end
|
16
|
+
|
17
|
+
def decompress
|
18
|
+
zstream = Zlib::Inflate.new
|
19
|
+
buf = zstream.inflate(@string)
|
20
|
+
zstream.finish
|
21
|
+
zstream.close
|
22
|
+
buf
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
module StringExtension
|
27
|
+
def kabuki_zip
|
28
|
+
Kabuki::Zip.new(self).compress
|
29
|
+
end
|
30
|
+
|
31
|
+
def kabuki_unzip
|
32
|
+
Kabuki::Zip.new(self).decompress
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
::String.send(:include, StringExtension)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'active_tools/core_extension/kabuki/crypt'
|
2
|
+
require 'active_tools/core_extension/kabuki/dump'
|
3
|
+
require 'active_tools/core_extension/kabuki/zip'
|
4
|
+
|
5
|
+
module ActiveTools
|
6
|
+
module CoreExtension
|
7
|
+
|
8
|
+
module Kabuki
|
9
|
+
module ObjectExtension
|
10
|
+
def kabuki!
|
11
|
+
Base64.strict_encode64(self.kabuki_dump.kabuki_zip.kabuki_encrypt)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module StringExtension
|
16
|
+
def kabuki
|
17
|
+
Base64.strict_decode64(self).kabuki_decrypt.kabuki_unzip.kabuki_load
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
::Object.send(:include, ObjectExtension)
|
22
|
+
::String.send(:include, StringExtension)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -4,7 +4,7 @@ module ActiveTools
|
|
4
4
|
module CoreExtension
|
5
5
|
|
6
6
|
module MergeHashup
|
7
|
-
module
|
7
|
+
module HashExtension
|
8
8
|
# Merge hashup sequence.
|
9
9
|
#
|
10
10
|
# === Example:
|
@@ -23,6 +23,7 @@ module ActiveTools
|
|
23
23
|
end
|
24
24
|
|
25
25
|
end
|
26
|
+
::Hash.send(:include, HashExtension)
|
26
27
|
end
|
27
28
|
end
|
28
29
|
end
|
@@ -2,29 +2,10 @@ require 'active_tools/core_extension/deep_copy'
|
|
2
2
|
require 'active_tools/core_extension/deep_merge'
|
3
3
|
require 'active_tools/core_extension/hashup'
|
4
4
|
require 'active_tools/core_extension/merge_hashup'
|
5
|
+
require 'active_tools/core_extension/kabuki'
|
5
6
|
|
6
7
|
module ActiveTools
|
7
8
|
module CoreExtension
|
8
9
|
|
9
|
-
module HashExtension
|
10
|
-
include DeepCopy::Hash
|
11
|
-
include DeepMerge::Hash
|
12
|
-
include MergeHashup::Hash
|
13
|
-
end
|
14
|
-
|
15
|
-
module ArrayExtension
|
16
|
-
include DeepCopy::Array
|
17
|
-
include Hashup::Array
|
18
|
-
end
|
19
|
-
|
20
|
-
module SetExtension
|
21
|
-
include DeepCopy::Set
|
22
|
-
end
|
23
|
-
|
24
|
-
::Hash.send(:include, HashExtension)
|
25
|
-
::Array.send(:include, ArrayExtension)
|
26
|
-
::Set.send(:include, SetExtension)
|
27
|
-
|
28
10
|
end
|
29
|
-
|
30
11
|
end
|
data/lib/active_tools/engine.rb
CHANGED
File without changes
|
@@ -0,0 +1,105 @@
|
|
1
|
+
module ActiveTools
|
2
|
+
module Misc
|
3
|
+
module InputSource
|
4
|
+
module ErrorsExtension
|
5
|
+
extend ::ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
delegate :field_of, :to => :@base
|
9
|
+
end
|
10
|
+
|
11
|
+
def fields
|
12
|
+
keys.map {|attribute| field_of(attribute)}.compact.tap do |names|
|
13
|
+
names.instance_eval do
|
14
|
+
def ids
|
15
|
+
self.map(&:to_id)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
module ConverseParameters
|
23
|
+
def converse_parameters(value, prefix = nil, parent = nil)
|
24
|
+
case value
|
25
|
+
when Hash
|
26
|
+
value.each do |k, v|
|
27
|
+
new_prefix = prefix ? "#{prefix}[#{k}]" : k
|
28
|
+
converse_parameters(v, new_prefix, value)
|
29
|
+
end
|
30
|
+
when Array
|
31
|
+
value.each do |e|
|
32
|
+
new_prefix = "#{prefix}[]"
|
33
|
+
converse_parameters(e, new_prefix, value)
|
34
|
+
end
|
35
|
+
else
|
36
|
+
value
|
37
|
+
end
|
38
|
+
value.tap do |v|
|
39
|
+
v.singleton_class.send(:undef_method, :belongs_to) if v.respond_to?(:belongs_to)
|
40
|
+
v.define_singleton_method :belongs_to do
|
41
|
+
parent
|
42
|
+
end
|
43
|
+
v.singleton_class.send(:undef_method, :input_source) if v.respond_to?(:input_source)
|
44
|
+
v.define_singleton_method :input_source do
|
45
|
+
prefix.to_s
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
module RequestExtension
|
52
|
+
include ConverseParameters
|
53
|
+
|
54
|
+
private
|
55
|
+
def normalize_parameters(value)
|
56
|
+
converse_parameters(super)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
module AttributesAssignment
|
61
|
+
def assign_attributes(*args)
|
62
|
+
new_attributes = args.first
|
63
|
+
if new_attributes.respond_to?(:input_source)
|
64
|
+
@input_source = new_attributes.input_source
|
65
|
+
end
|
66
|
+
super(*args)
|
67
|
+
end
|
68
|
+
|
69
|
+
def field_of(attribute)
|
70
|
+
if @input_source && has_attribute?(attribute)
|
71
|
+
"#{@input_source}[#{attribute}]".tap do |input_source|
|
72
|
+
input_source.instance_eval do
|
73
|
+
def to_id
|
74
|
+
self.gsub(/\]\[|[^-a-zA-Z0-9:.]/, "_").sub(/_$/, "")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
module OnLoadActionController
|
86
|
+
::ActionDispatch::Request.send(:include, Misc::InputSource::RequestExtension)
|
87
|
+
|
88
|
+
def converse(hash, key)
|
89
|
+
converse_parameters(hash[key], key)
|
90
|
+
end
|
91
|
+
|
92
|
+
private
|
93
|
+
include Misc::InputSource::ConverseParameters
|
94
|
+
end
|
95
|
+
|
96
|
+
module OnLoadActiveRecord
|
97
|
+
::ActiveModel::Errors.send(:include, Misc::InputSource::ErrorsExtension)
|
98
|
+
|
99
|
+
if Rails.version >= "3.2.9"
|
100
|
+
::ActiveRecord::AttributeAssignment.send(:include, Misc::InputSource::AttributesAssignment)
|
101
|
+
else
|
102
|
+
include Misc::InputSource::AttributesAssignment
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module ActiveTools
|
2
|
+
module Misc
|
3
|
+
module ScriptFlow
|
4
|
+
class Map
|
5
|
+
attr_reader :content
|
6
|
+
|
7
|
+
delegate :any?, :empty?, :to => :content
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@content = ::ActiveSupport::OrderedHash.new { |h,k| h[k] = ::ActiveSupport::SafeBuffer.new }
|
11
|
+
end
|
12
|
+
|
13
|
+
# Called by _layout_for to read stored values.
|
14
|
+
def get(key)
|
15
|
+
@content[key]
|
16
|
+
end
|
17
|
+
|
18
|
+
# Called by each renderer object to set the layout contents.
|
19
|
+
def set(key, value)
|
20
|
+
@content[key] = value
|
21
|
+
end
|
22
|
+
|
23
|
+
# Called by content_for
|
24
|
+
def append(key, value)
|
25
|
+
@content[key] << value
|
26
|
+
end
|
27
|
+
alias_method :append!, :append
|
28
|
+
|
29
|
+
def add_script(script)
|
30
|
+
set(script.hash, script)
|
31
|
+
end
|
32
|
+
|
33
|
+
def render
|
34
|
+
@content.values.join("\n").html_safe
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
module OnLoadActionController
|
42
|
+
included do
|
43
|
+
helper_method :script_flow
|
44
|
+
end
|
45
|
+
|
46
|
+
def script_flow
|
47
|
+
@script_flow ||= Misc::ScriptFlow::Map.new
|
48
|
+
end
|
49
|
+
|
50
|
+
def _render_template(options)
|
51
|
+
if lookup_context.rendered_format == :js
|
52
|
+
super + script_flow.render
|
53
|
+
else
|
54
|
+
super
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
module OnLoadActionView
|
60
|
+
def script(content = nil, &block)
|
61
|
+
if content || block_given?
|
62
|
+
if block_given?
|
63
|
+
content = capture(&block)
|
64
|
+
end
|
65
|
+
if content
|
66
|
+
case request.format
|
67
|
+
when Mime::JS then
|
68
|
+
script_flow.add_script(content)
|
69
|
+
nil
|
70
|
+
when Mime::HTML then
|
71
|
+
javascript_tag(content)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def script_for(identifier, content = nil, &block)
|
78
|
+
content_for(identifier, script(content, &block))
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
data/lib/active_tools/railtie.rb
CHANGED
@@ -5,10 +5,13 @@ module ActiveTools
|
|
5
5
|
class Railtie < ::Rails::Railtie
|
6
6
|
config.before_initialize do
|
7
7
|
::ActiveSupport.on_load :active_record do
|
8
|
+
include OnLoadActiveRecord
|
8
9
|
end
|
9
10
|
::ActiveSupport.on_load :action_controller do
|
11
|
+
include OnLoadActionController
|
10
12
|
end
|
11
13
|
::ActiveSupport.on_load :action_view do
|
14
|
+
include OnLoadActionView
|
12
15
|
end
|
13
16
|
end
|
14
17
|
|
data/lib/active_tools/version.rb
CHANGED
data/lib/active_tools.rb
CHANGED
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -27,7 +27,7 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '0'
|
30
|
-
description: Missing tools for Rails developers
|
30
|
+
description: Missing tools for Rails developers
|
31
31
|
email:
|
32
32
|
- addagger@gmail.com
|
33
33
|
executables: []
|
@@ -41,17 +41,30 @@ files:
|
|
41
41
|
- Rakefile
|
42
42
|
- active_tools.gemspec
|
43
43
|
- lib/active_tools.rb
|
44
|
+
- lib/active_tools/action_pack/action_controller.rb
|
45
|
+
- lib/active_tools/action_pack/action_controller/path_helper.rb
|
46
|
+
- lib/active_tools/action_pack/action_dispatch.rb
|
47
|
+
- lib/active_tools/action_pack/action_dispatch/flash_stack.rb
|
48
|
+
- lib/active_tools/action_pack/action_view.rb
|
49
|
+
- lib/active_tools/action_pack/action_view/tag_attributes.rb
|
44
50
|
- lib/active_tools/actionpack.rb
|
45
|
-
- lib/active_tools/
|
46
|
-
- lib/active_tools/
|
51
|
+
- lib/active_tools/active_model/delegate_attributes.rb
|
52
|
+
- lib/active_tools/activemodel.rb
|
47
53
|
- lib/active_tools/activesupport.rb
|
48
54
|
- lib/active_tools/bundle.rb
|
49
55
|
- lib/active_tools/core_extension.rb
|
50
56
|
- lib/active_tools/core_extension/deep_copy.rb
|
51
57
|
- lib/active_tools/core_extension/deep_merge.rb
|
52
58
|
- lib/active_tools/core_extension/hashup.rb
|
59
|
+
- lib/active_tools/core_extension/kabuki.rb
|
60
|
+
- lib/active_tools/core_extension/kabuki/crypt.rb
|
61
|
+
- lib/active_tools/core_extension/kabuki/dump.rb
|
62
|
+
- lib/active_tools/core_extension/kabuki/zip.rb
|
53
63
|
- lib/active_tools/core_extension/merge_hashup.rb
|
54
64
|
- lib/active_tools/engine.rb
|
65
|
+
- lib/active_tools/misc.rb
|
66
|
+
- lib/active_tools/misc/input_source.rb
|
67
|
+
- lib/active_tools/misc/script_flow.rb
|
55
68
|
- lib/active_tools/railtie.rb
|
56
69
|
- lib/active_tools/version.rb
|
57
70
|
homepage: http://vkvon.ru/projects/active_tools
|
@@ -77,5 +90,6 @@ rubyforge_project: active_tools
|
|
77
90
|
rubygems_version: 1.8.24
|
78
91
|
signing_key:
|
79
92
|
specification_version: 3
|
80
|
-
summary: ActionDispatch, ActiveRecord, ActiveSupport
|
93
|
+
summary: ActionDispatch, ActionController, ActiveModel, ActiveRecord, ActiveSupport,
|
94
|
+
ActionView and core extensions
|
81
95
|
test_files: []
|