active_tools 0.0.6 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6884fd00e3b38429d219a9d533116fa46c824de0
4
- data.tar.gz: 5fa48a6d56370b0e68729b71ac24977f6c327bfd
3
+ metadata.gz: 51b06ad3dec14fa1f094a6024d64ca9ed4b50ed5
4
+ data.tar.gz: 7a599525d1dbefef2de63aca1be53497c0ee8407
5
5
  SHA512:
6
- metadata.gz: 478603a760745f50193cbe24358e39fefef37792a766b0d31bad36f686b127812deb76f80e9d8d11cdc963a20d3d773287350855d1af7a8db1cb93c44fddf342
7
- data.tar.gz: c8f2fbae68a570892e9f212a0bc9c1c611867d064e0212eb8668fe4ed3515aa096482dae36dd95ea30ef872a59a5a8dccb10a6bb4767676c0fabfdbc6d7281ce
6
+ metadata.gz: 5d609f04f1b350636e47bf4107f438f1a34a654ca5a1e57e8276d322870d7df28df98acd35d3d6409af68871e63b7a63813c0a78b7c9d8e5ad19a01507581a04
7
+ data.tar.gz: c392bec6ca96f1b3ea97b27623c16ec88ed837557de8443b7faff5fdccb7914689457df20825a54569f133f03a6dda6555493c116aa010f0d7764f6a5c460cfc
data/active_tools.gemspec CHANGED
@@ -14,8 +14,8 @@ Gem::Specification.new do |gem|
14
14
 
15
15
  gem.rubyforge_project = "active_tools"
16
16
 
17
- gem.add_dependency "rails"
18
- gem.add_development_dependency "rspec"
17
+ gem.add_runtime_dependency "rails", "~> 4"
18
+ gem.add_development_dependency "rspec", "~> 0"
19
19
 
20
20
  gem.files = `git ls-files`.split($/)
21
21
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -1,3 +1,6 @@
1
+ require 'active_tools/action_pack/action_controller/path_helper/complex_helpers'
2
+ require 'active_tools/action_pack/action_controller/path_helper/http_referer'
3
+
1
4
  module ActiveTools
2
5
  module ActionPack
3
6
  module ActionController
@@ -5,31 +8,10 @@ module ActiveTools
5
8
  extend ::ActiveSupport::Concern
6
9
 
7
10
  included do
8
- helper_method :path?, :action?, :controller?, :current_action, :current_controller
11
+ include ComplexHelpers
12
+ helper_method :path?, :action?, :controller?, :current_action, :current_controller, :http_referer
9
13
  end
10
14
 
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
15
  def current_action
34
16
  request.path_parameters[:action]
35
17
  end
@@ -37,6 +19,11 @@ module ActiveTools
37
19
  def current_controller
38
20
  request.path_parameters[:controller]
39
21
  end
22
+
23
+ def http_referer(environment = {})
24
+ @http_referer ||= HttpReferer.new(request, environment)
25
+ end
26
+
40
27
  end
41
28
  end
42
29
  end
@@ -3,7 +3,6 @@ module ActiveTools
3
3
  module ActionView
4
4
  module TagAttributes
5
5
  class Collect
6
- attr_reader :hash
7
6
  def initialize(hash = nil)
8
7
  @hash = HashWithIndifferentAccess.new {|h,k| h[k] = Array.new}
9
8
  merge(hash) if hash
@@ -30,6 +29,10 @@ module ActiveTools
30
29
  Hash[@hash.map {|k,v| [k, v.join(" ")]}]
31
30
  end
32
31
 
32
+ def hash
33
+ @hash.symbolize_keys
34
+ end
35
+
33
36
  private
34
37
 
35
38
  def type_valid(object = nil)
@@ -1,5 +1,6 @@
1
1
  require 'active_tools/action_pack/action_view/tag_attributes'
2
2
  require 'active_tools/action_pack/action_view/perform_as_tree'
3
+ require 'active_tools/action_pack/action_view/uniq_content_for'
3
4
 
4
5
  module ActiveTools
5
6
  module ActionPack
@@ -12,6 +12,7 @@ module ActiveTools
12
12
  @foreign_key = reflection.foreign_key
13
13
  @remote_attributes = @options[:remote_attributes]
14
14
  @init_proc = @options[:init_proc]
15
+ @nullify_if = @options[:nullify_if]
15
16
  @update_if = @options[:update_if]
16
17
  @destroy_if = @options[:destroy_if]
17
18
  @uniq_by = Array(@options[:uniq_by]).map(&:to_s)
@@ -34,12 +35,19 @@ module ActiveTools
34
35
  end
35
36
  end
36
37
  end
38
+
39
+ def try_nullify
40
+ if nullify?
41
+ store_backup!
42
+ self.target = nil
43
+ end
44
+ end
37
45
 
38
- def try_commit
46
+ def try_commit
39
47
  try_commit_existed || try_update
40
48
  end
41
49
 
42
- def try_destroy
50
+ def try_destroy
43
51
  try_destroy_backup
44
52
  try_destroy_target
45
53
  end
@@ -47,7 +55,7 @@ module ActiveTools
47
55
  def try_update
48
56
  if updateable_backup?
49
57
  begin
50
- @backup.update(attributes(@template, *@remote_attributes))
58
+ @backup.update(attributes(@template, *@remote_attributes))
51
59
  rescue ::ActiveRecord::StaleObjectError
52
60
  @backup.reload
53
61
  try_update
@@ -57,9 +65,11 @@ module ActiveTools
57
65
  end
58
66
 
59
67
  def try_commit_existed
60
- if @template.present? && @uniq_by.any? && existed = detect_existed
68
+ if @template.present? && @uniq_by.any? && (existed = detect_existed)
61
69
  self.target = existed
62
- try_destroy_updateable_backup
70
+ if updateable_backup?
71
+ @backup.mark_for_destruction
72
+ end
63
73
  true
64
74
  end
65
75
  end
@@ -75,18 +85,7 @@ module ActiveTools
75
85
  end
76
86
  end
77
87
 
78
- def try_destroy_updateable_backup
79
- if updateable_backup?
80
- begin
81
- @backup.destroy
82
- rescue ::ActiveRecord::StaleObjectError
83
- @backup.reload
84
- try_destroy_updateable_backup
85
- end
86
- end
87
- end
88
-
89
- def try_destroy_target(force = false)
88
+ def try_destroy_target
90
89
  if destroyable_target?
91
90
  begin
92
91
  target.destroy
@@ -111,8 +110,8 @@ module ActiveTools
111
110
  relation_options_call = "#{attribute}_relation_options"
112
111
  if klass.respond_to?(relation_options_call)
113
112
  values = @template.send(relation_options_call)
114
- outer_values.merge!(values[:outer_values])
115
- where_values.merge!(values[:where_values])
113
+ outer_values.deep_merge!(values[:outer_values])
114
+ where_values.deep_merge!(values[:where_values])
116
115
  else
117
116
  where_values[attribute] = @template.send(attribute)
118
117
  end
@@ -120,16 +119,20 @@ module ActiveTools
120
119
  klass.includes(outer_values).where(where_values).limit(1).first
121
120
  end
122
121
 
122
+ def nullify?
123
+ target.present? && @nullify_if.try(:call, (target.persisted? ? target.reload : target), owner)
124
+ end
125
+
123
126
  def updateable_backup?
124
- @backup.present? && @update_if.try(:call, @backup)
127
+ @backup.try(:persisted?) && @update_if.try(:call, @backup.reload, owner)
125
128
  end
126
129
 
127
130
  def destroyable_backup?
128
- @backup.present? && !@backup.destroyed? && @destroy_if.try(:call, @backup)
131
+ @backup.try(:persisted?) && (!@backup.destroyed?||@backup.marked_for_destruction?) && @destroy_if.try(:call, @backup.reload, owner)
129
132
  end
130
133
 
131
134
  def destroyable_target?
132
- target.try(:persisted?) && !target.destroyed? && @destroy_if.try(:call, target)
135
+ target.try(:persisted?) && (!target.destroyed?||target.marked_for_destruction?) && @destroy_if.try(:call, target.reload, owner)
133
136
  end
134
137
 
135
138
  def attributes(object, *attrs)
@@ -144,6 +147,9 @@ module ActiveTools
144
147
 
145
148
  def restore_backup!
146
149
  if @backup
150
+ if @backup.marked_for_destruction?
151
+ @backup.instance_variable_set(:@marked_for_destruction, false)
152
+ end
147
153
  self.target = @backup
148
154
  @backup = nil
149
155
  end
@@ -165,7 +171,15 @@ module ActiveTools
165
171
 
166
172
  def target=(record)
167
173
  if owner.persisted?
168
- association.send(:replace_keys, record)
174
+ if Rails.version >= "4.1.0"
175
+ if record
176
+ association.send(:replace_keys, record)
177
+ else
178
+ association.send(:remove_keys)
179
+ end
180
+ else
181
+ association.send(:replace_keys, record)
182
+ end
169
183
  association.set_inverse_instance(record)
170
184
  association.instance_variable_set(:@updated, true) if record != @backup
171
185
  association.target = record
@@ -184,7 +198,7 @@ module ActiveTools
184
198
  target.dup
185
199
  end
186
200
  @template.tap do |t|
187
- @init_proc.try(:call, t)
201
+ @init_proc.try(:call, t, owner)
188
202
  end
189
203
  end
190
204
  end
@@ -1,3 +1,4 @@
1
+ require 'active_tools/core_extension/deep_merge'
1
2
  require 'active_tools/active_record/adaptive_belongs_to/adapter'
2
3
  module ActiveTools
3
4
  module ActiveRecord
@@ -50,8 +51,8 @@ module ActiveTools
50
51
  unless reflection = reflections[assoc_name]
51
52
  raise(ArgumentError, ":#{assoc_name} method doesn't look like an association accessor!")
52
53
  end
53
- adapter_name = "#{assoc_name}_"
54
- config_name = "#{assoc_name}_adapter_options"
54
+ adapter_name = "#{assoc_name}_adaptive"
55
+ config_name = "#{assoc_name}_adaptive_options"
55
56
 
56
57
  raise(TypeError, "Option :attributes must be a Hash. #{options[:attributes].class} passed!") unless options[:attributes].is_a?(Hash)
57
58
  attr_map = options.delete(:attributes).with_indifferent_access
@@ -62,11 +63,15 @@ module ActiveTools
62
63
  self.send("#{config_name}=", options.merge(:remote_attributes => attr_map.keys))
63
64
 
64
65
  class_eval <<-EOV
65
- after_validation do
66
+ before_validation do
67
+ #{adapter_name}.try_nullify
68
+ end
69
+
70
+ #{Rails.version >= "4.1.0" ? "after_validation" : "before_save"} do
66
71
  #{adapter_name}.try_commit
67
72
  end
68
73
 
69
- after_commit do
74
+ after_save do
70
75
  #{adapter_name}.try_destroy_backup
71
76
  #{adapter_name}.clear!
72
77
  end
@@ -86,28 +91,13 @@ module ActiveTools
86
91
  define_method local_attribute do
87
92
  send(adapter_name).read(remote_attribute)
88
93
  end
89
-
94
+
90
95
  define_method "#{local_attribute}=" do |value|
91
96
  send(adapter_name).write(remote_attribute, value)
92
97
  end
93
98
  end
94
99
  end
95
-
96
- # attr_map.each do |remote_attribute, local_attribute|
97
- # class_eval <<-EOV
98
- # def #{local_attribute}_adaptive
99
- # [{:#{assoc_name} => {}}, {:#{reflections[assoc_name].table_name} => {:#{remote_attribute} => #{local_attribute}}}]
100
- # end
101
- #
102
- # def #{local_attribute}
103
- # #{adapter_name}.read(:#{remote_attribute})
104
- # end
105
- #
106
- # def #{local_attribute}=(value)
107
- # #{adapter_name}.write(:#{remote_attribute}, value)
108
- # end
109
- # EOV
110
- # end
100
+
111
101
  end
112
102
  end
113
103
  end
@@ -27,7 +27,7 @@ module ActiveTools
27
27
  foreign_key = reflection.foreign_key
28
28
  if (@_after_create_custom_counter_called ||= false)
29
29
  @_after_create_custom_counter_called = false
30
- elsif send(:attribute_changed?, foreign_key) && !new_record? && (Rails.version >= "4.1.0" ? association(assoc_name).constructable? : defined?(reflection.klass.to_s.camelize))
30
+ elsif send(:attribute_changed?, foreign_key) && !new_record? && defined?(reflection.klass.to_s.camelize)
31
31
  model = reflection.klass
32
32
  foreign_key_was = attribute_was foreign_key
33
33
  foreign_key = attribute foreign_key
@@ -1,6 +1,7 @@
1
1
  require 'active_tools/active_record/record_id'
2
2
  require 'active_tools/active_record/adaptive_belongs_to'
3
3
  require 'active_tools/active_record/custom_counter_cache'
4
+ require 'active_tools/active_record/with_permalink'
4
5
 
5
6
  module ActiveTools
6
7
  module ActiveRecord
@@ -1,55 +1,14 @@
1
+ require 'active_tools/misc/uniq_content'
2
+
1
3
  module ActiveTools
2
4
  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
5
+ DEFAULT_JS_FLOW_KEY = :_script_flow
39
6
  end
40
7
 
41
8
  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
9
  def _render_template(options)
51
10
  if lookup_context.rendered_format == :js
52
- super + script_flow.render
11
+ super + uniq_content_storage.render_content(Misc::DEFAULT_JS_FLOW_KEY)
53
12
  else
54
13
  super
55
14
  end
@@ -57,25 +16,33 @@ module ActiveTools
57
16
  end
58
17
 
59
18
  module OnLoadActionView
60
- def script(content = nil, &block)
19
+ def script(*args, &block)
20
+ options = args.extract_options!
21
+ content = args.first
61
22
  if content || block_given?
62
23
  if block_given?
63
24
  content = capture(&block)
64
25
  end
65
26
  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
27
+ case request.format
28
+ when Mime::JS then
29
+ uniq_content_storage.append_content(content, Misc::DEFAULT_JS_FLOW_KEY)
30
+ nil
31
+ when Mime::HTML then
32
+ unless uniq_content_storage.remembered?(content, options[:volume])
33
+ flow = uniq_content_storage.remember(content, options[:volume])
34
+ options[:javascript_tag] == false ? flow : javascript_tag(flow, options)
35
+ end
36
+ end
73
37
  end
74
38
  end
75
39
  end
76
40
 
77
- def script_for(identifier, content = nil, &block)
78
- content_for(identifier, script(content, &block))
41
+ def script_for(identifier, *args, &block)
42
+ options = args.extract_options!
43
+ content_for(identifier) do
44
+ script(args, options.merge(:volume => identifier), &block)
45
+ end
79
46
  end
80
47
  end
81
48
 
@@ -1,9 +1,9 @@
1
+ require 'active_tools/misc/uniq_content'
1
2
  require 'active_tools/misc/script_flow'
2
3
  require 'active_tools/misc/input_source'
3
4
 
4
5
  module ActiveTools
5
6
  module Misc
6
7
 
7
-
8
8
  end
9
9
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveTools
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.10"
3
3
  end
metadata CHANGED
@@ -1,41 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Valery Kvon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-05 00:00:00.000000000 Z
11
+ date: 2014-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '4'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '4'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  description: Missing tools for Rails developers
@@ -45,9 +45,9 @@ executables: []
45
45
  extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
- - .gitignore
49
- - .ruby-gemset
50
- - .ruby-version
48
+ - ".gitignore"
49
+ - ".ruby-gemset"
50
+ - ".ruby-version"
51
51
  - Gemfile
52
52
  - LICENSE.txt
53
53
  - README.md
@@ -102,17 +102,17 @@ require_paths:
102
102
  - lib
103
103
  required_ruby_version: !ruby/object:Gem::Requirement
104
104
  requirements:
105
- - - '>='
105
+ - - ">="
106
106
  - !ruby/object:Gem::Version
107
107
  version: '0'
108
108
  required_rubygems_version: !ruby/object:Gem::Requirement
109
109
  requirements:
110
- - - '>='
110
+ - - ">="
111
111
  - !ruby/object:Gem::Version
112
112
  version: '0'
113
113
  requirements: []
114
114
  rubyforge_project: active_tools
115
- rubygems_version: 2.0.4
115
+ rubygems_version: 2.2.2
116
116
  signing_key:
117
117
  specification_version: 4
118
118
  summary: ActionDispatch, ActionController, ActiveModel, ActiveRecord, ActiveSupport,