active_touch 1.1.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NjllZTYxOGYxODMwMmZjMGRjZmRlODMxOTc4MDkyY2MyZDYzOTJkOA==
4
+ ZWFlZTI2MzdlMmFiOTQ1MTI0ZDg0YmFiMWViYjNhZGE5MWQ0YmNiNw==
5
5
  data.tar.gz: !binary |-
6
- YzJlM2ExNjBiMTBhNGI4MWIwMjJlNWE5NDdhNDMwNTU5OGRkYjFhYQ==
6
+ N2RlYTU2MGNmODZjMTBlZTFmYTIwMGI5MTU0NDg1YzI1OWQyMmFjMQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZmNkNWM1MGFlZjMxOTRiMDgwZTc3ZTQ4MGE4ZDFmMTNjYjQzNTFhYTI4MjNj
10
- ZTc0MGU0M2RmNTE3MzJmOTkwMjAxZDk5OGQ1MTBiZGJmZWVkMWQ5NmRmNDU1
11
- OGI4NDdkY2FjOTE1NGM0MGMzOTcwYzUxYmJmNTgwZjBhZmFjN2M=
9
+ M2JjNTcwMTQ2ZDI3ZWM3ZWUxZjEwZDhlZjJhM2I4YWQ4N2FiYWYzNzM1Njhi
10
+ MjVjMWFlODNjYTQ3NzcwZjAxNGUxMmJlMzM1ZjYzNGI4NTdlNWNkMjhhZTFl
11
+ MjYzNDNkOTg0YzQwMWIyZjhlNjZmZDE2ZmI1N2QyN2RmNzNmYTU=
12
12
  data.tar.gz: !binary |-
13
- ZmYxOTZkZmI2NGM4ZTY2MGZkM2VhODllNGE1ZGE1OTczYjk3YTg1NmRiNDc3
14
- ZDZjYmM3NDNkNzFiYzQ1M2I5YThiZjQ5NGE1ZDdjYThhYzEyMmI3YWQ4ZWI5
15
- ZTBmODcwZDI2ZDkzYzZhZDY2MmVlYmI5YjgwM2M2MGM4NDVkNmI=
13
+ ZjM5Y2UwYzUxZWIwNmMyMmJiOWJiM2MzYTZiODczMzFhNzlkMjU1NjgyNDI0
14
+ Y2JlNmI4YmUxY2YxOTcwMDBjNDMwZGZhMGI0MTdmNzk0Mjg0NmU3ZjFjNjRi
15
+ N2YzMzdlZDJmMTg0NTA2MmU1YTNhNzZiZjYzMWNhNWRkYzcyYzU=
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active_touch (1.0.0)
4
+ active_touch (1.4.0)
5
5
  rails (~> 4.2)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -9,7 +9,13 @@ A more robust touch for ActiveRecord associations.
9
9
  Add the gem to your Gemfile:
10
10
 
11
11
  ```ruby
12
- gem 'activetouch', '~> 1.0.0'
12
+ gem 'activetouch', '~> 1.4.0'
13
+ ```
14
+
15
+ Then run the installer:
16
+
17
+ ```ruby
18
+ rails g active_touch:install
13
19
  ```
14
20
 
15
21
  ## Usage
@@ -26,6 +32,9 @@ end
26
32
 
27
33
  NOTE: It doesn't matter what type of association is given. The association can even reference an instance method that returns an `ActiveRecord` collection or record.
28
34
 
35
+
36
+ ### Attribute specific touches
37
+
29
38
  To only call the touch when specific attributes are changed, supply an array of attributes with `:watch`. The following example will only touch `:relations` when `:name` or `:code` changes.
30
39
 
31
40
  ```ruby
@@ -36,6 +45,9 @@ class Model < ActiveRecord::Base
36
45
  end
37
46
  ```
38
47
 
48
+
49
+ ### After Touch Callback
50
+
39
51
  To call a method on the touched records, use `:after_touch`. The following example will call `:do_something` on the associated records after a tocuh.
40
52
 
41
53
  ```ruby
@@ -48,6 +60,9 @@ end
48
60
 
49
61
  NOTE: The `after_touch` method must be an instance method defined on the associated Class.
50
62
 
63
+
64
+ ### Asynchronous touch
65
+
51
66
  The touch can also be queued and run in the background using `ActiveJob` by setting the `:async` flag. The following example will run a touch in the background.
52
67
 
53
68
  ```ruby
@@ -59,3 +74,12 @@ end
59
74
  ```
60
75
 
61
76
  NOTE: The default is `async: false`
77
+
78
+
79
+ ## Options
80
+
81
+ There are a few options that you can change by updating `config/initializers/active_touch.rb`.
82
+
83
+ - `async`: Define a default for all touches to run asynchronously by setting this to true.
84
+ - `ignored_attributes`: When no `watch` argument is supplied, all attribute changes can trigger a touch. Define a default list of ignored attributes here. Default is `:updated_at`.
85
+ - `queue`: Specify which queue to put asynchronous jobs in.
data/lib/active_touch.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'active_touch/version'
2
+ require 'active_touch/configuration'
2
3
  require 'active_touch/define_touch'
3
4
  require 'active_touch/touch_job'
4
5
 
@@ -0,0 +1,25 @@
1
+ module ActiveTouch
2
+
3
+ class << self
4
+ attr_accessor :configuration
5
+ end
6
+
7
+ def self.configuration
8
+ @configuration ||= Configuration.new
9
+ end
10
+
11
+ def self.configure
12
+ yield(configuration)
13
+ end
14
+
15
+ class Configuration
16
+ attr_accessor :async, :ignored_attributes, :queue
17
+
18
+ def initialize
19
+ @async = false
20
+ @ignored_attributes = [:updated_at]
21
+ @queue = 'default'
22
+ end
23
+ end
24
+
25
+ end
@@ -23,11 +23,17 @@ module ActiveTouch
23
23
 
24
24
  @klass.send :define_method, @touch_method do |*args|
25
25
  changed_attributes = self.previous_changes.keys.map(&:to_sym)
26
+ watched_changes = (options[:watch] & changed_attributes)
26
27
 
27
- if (options[:watch] & changed_attributes).any?
28
+ # watched values changed and conditional procs evaluate to true
29
+ if watched_changes.any? && options[:if].call(self) && !options[:unless].call(self)
30
+ Rails.logger.debug "Touch: #{self.class}(#{self.id}) => #{association} due to changes in #{watched_changes}"
28
31
 
29
32
  if options[:async]
30
- TouchJob.perform_later(self, association.to_s, options[:after_touch].to_s)
33
+ TouchJob
34
+ .set(queue: ActiveTouch.configuration.queue)
35
+ .perform_later(self, association.to_s, options[:after_touch].to_s)
36
+
31
37
  else
32
38
  TouchJob.perform_now(self, association.to_s, options[:after_touch].to_s)
33
39
  end
@@ -43,9 +49,11 @@ module ActiveTouch
43
49
 
44
50
  def default_options
45
51
  {
46
- async: false,
47
- watch: @klass.column_names.map(&:to_sym),
48
- after_touch: nil
52
+ async: ActiveTouch.configuration.async,
53
+ watch: @klass.column_names.map(&:to_sym) - ActiveTouch.configuration.ignored_attributes,
54
+ after_touch: nil,
55
+ if: Proc.new { true },
56
+ unless: Proc.new { false }
49
57
  }
50
58
  end
51
59
 
@@ -12,7 +12,7 @@ module ActiveTouch
12
12
  associated.update_columns(updated_at: record.updated_at)
13
13
  associated.send(after_touch) unless after_touch.blank?
14
14
 
15
- else
15
+ elsif !associated.nil?
16
16
  associated.update_all(updated_at: record.updated_at)
17
17
  associated.each { |associate| associate.send(after_touch) } unless after_touch.blank?
18
18
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveTouch
2
- VERSION = '1.1.0'
2
+ VERSION = '1.4.0'
3
3
  end
@@ -0,0 +1,6 @@
1
+
2
+ class InitializerGenerator < Rails::Generators::Base
3
+ def create_initializer_file
4
+ create_file "config/initializers/initializer.rb", "# Add initialization content here"
5
+ end
6
+ end
@@ -0,0 +1,12 @@
1
+ module ActiveTouch
2
+ module Generators
3
+ class InstallGenerator < ::Rails::Generators::Base
4
+ source_root File.expand_path('../templates', __FILE__)
5
+
6
+ def copy_files
7
+ template 'active_touch.rb', 'config/initializers/active_touch.rb'
8
+ end
9
+
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ ActiveTouch.configure do |config|
2
+ # All touches to run synchronously or asynchronously, unless specified
3
+ # Default is false
4
+ # config.async = false
5
+
6
+ # When :watch is not specified, ignore the following attributes.
7
+ # Default is [:updated_at]
8
+ # config.ignored_attributes = [:updated_at]
9
+
10
+ # Job queue for asynchronous jobs.
11
+ # Default is 'default'
12
+ # config.queue = 'default'
13
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_touch
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Pheasey
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-12-15 00:00:00.000000000 Z
11
+ date: 2015-12-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -71,9 +71,13 @@ files:
71
71
  - bin/console
72
72
  - bin/setup
73
73
  - lib/active_touch.rb
74
+ - lib/active_touch/configuration.rb
74
75
  - lib/active_touch/define_touch.rb
75
76
  - lib/active_touch/touch_job.rb
76
77
  - lib/active_touch/version.rb
78
+ - lib/generators/active_touch/initializer_generator.rb
79
+ - lib/generators/active_touch/install/install_generator.rb
80
+ - lib/generators/active_touch/install/templates/active_touch.rb
77
81
  homepage: https://github.com/kpheasey/active_touch
78
82
  licenses:
79
83
  - MIT