active_tools 0.0.2 → 0.0.3
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.
- 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: []
|