changey 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8760b67cbf8d8eec056fd80ead4b86c2133f31b4
4
+ data.tar.gz: 1d2fc324b094b89e5d9863056a9434347f864922
5
+ SHA512:
6
+ metadata.gz: 929f25e36a6ac959fc940a4f7d25d1141086aafbfd016e77939f1254e8d84cba9ec3f3e83241ceef860a9bd2c7253e1a6cbac9d44315f2ce695a347e6022a89b
7
+ data.tar.gz: 16e86288fd1a978e8675f22aca134b14e47d67743909f14bac1a4bba9772a4e5d584a8b3c831a75c4a9c0faf5f6dc5b0eaa7da73ba64d5340b257d3710bcfb33
data/lib/changey.rb ADDED
File without changes
@@ -0,0 +1,23 @@
1
+ module Changey
2
+ class BlockDSL
3
+ def initialize(track)
4
+ @track = track
5
+ end
6
+
7
+ def validate(name = nil, &block)
8
+ @track.validates << (block || name)
9
+ end
10
+
11
+ def before_save(name = nil, &block)
12
+ @track.before_saves << (block || name)
13
+ end
14
+
15
+ def after_save(name = nil, &block)
16
+ @track.after_saves << (block || name)
17
+ end
18
+
19
+ def after_commit(name = nil, &block)
20
+ @track.after_commits << (block || name)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,75 @@
1
+ require 'changey/track'
2
+ require 'changey/block_dsl'
3
+
4
+ module Changey
5
+ module DSL
6
+
7
+ class InvalidDSL < StandardError; end
8
+ class MissingChangeValue < InvalidDSL; end
9
+ class MissingBlock < InvalidDSL; end
10
+
11
+ def self.load(load_into)
12
+ load_into.extend ClassMethods
13
+ load_into.send :include, InstanceMethods
14
+ end
15
+
16
+ module ClassMethods
17
+ def changey_tracks
18
+ @changey_tracks ||= []
19
+ end
20
+
21
+ def when_attribute(attribute_name, options = {}, &block)
22
+ unless options.has_key?(:changes_from) || options.has_key?(:changes_to)
23
+ raise MissingChangeValue, "Attribute #{attribute_name} must specify a 'changes_to' or a 'changes_from' value"
24
+ end
25
+
26
+ unless block_given?
27
+ raise MissingBlock, "Attribute #{attribute_name} must specify a block"
28
+ end
29
+
30
+ track = Track.new(attribute_name)
31
+ track.direction = options.has_key?(:changes_from) ? :from : :to
32
+ track.expected_value = options.has_key?(:changes_from) ? options[:changes_from] : options[:changes_to]
33
+
34
+ if options.has_key?(:to) || options.has_key?(:from)
35
+ track.expected_other_value = options.has_key?(:to) ? options[:to] : options[:from]
36
+ end
37
+
38
+ BlockDSL.new(track).instance_eval(&block)
39
+ self.changey_tracks << track
40
+ track
41
+ end
42
+ end
43
+
44
+ module InstanceMethods
45
+
46
+ def self.included(base)
47
+ base.before_validation { set_changey_tracks }
48
+ base.validate { run_changey_callbacks(:validate) }
49
+ base.before_save { run_changey_callbacks(:before_save) }
50
+ base.after_save { run_changey_callbacks(:after_save) }
51
+ base.after_commit { run_changey_callbacks(:after_commit) }
52
+ end
53
+
54
+ private def set_changey_tracks
55
+ @changey_tracks_to_run = self.class.changey_tracks.select { |t| t.run?(self) }.each_with_object({}) do |track, hash|
56
+ hash[track] = [send("#{track.attribute}_was"), send(track.attribute)]
57
+ end
58
+ end
59
+
60
+ private def run_changey_callbacks(event)
61
+ @changey_tracks_to_run.each do |track, (was, now)|
62
+ callbacks = track.send(event.to_s.pluralize)
63
+ callbacks.each do |callback|
64
+ if callback.is_a?(Proc)
65
+ instance_exec(was, now, &callback)
66
+ elsif callback.is_a?(Symbol)
67
+ send(callback)
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ end
75
+ end
@@ -0,0 +1,12 @@
1
+ module Changey
2
+ class Railtie < Rails::Railtie
3
+
4
+ initializer 'changey.initialize' do
5
+ ActiveSupport.on_load(:active_record) do
6
+ require 'changey/dsl'
7
+ Changey::DSL.load ActiveRecord::Base
8
+ end
9
+ end
10
+
11
+ end
12
+ end
@@ -0,0 +1,54 @@
1
+ module Changey
2
+ class Track
3
+
4
+ class Nothing
5
+ end
6
+
7
+ attr_reader :attribute
8
+ attr_accessor :direction # :from or :to
9
+ attr_accessor :expected_value # The value expected
10
+ attr_accessor :expected_other_value # The value expected in the opposite state
11
+
12
+ attr_accessor :validates
13
+ attr_accessor :before_saves
14
+ attr_accessor :after_saves
15
+ attr_accessor :after_commits
16
+
17
+ def initialize(attribute)
18
+ @attribute = attribute
19
+ @expected_other_value = Nothing
20
+ @validates = []
21
+ @before_saves = []
22
+ @after_saves = []
23
+ @after_commits = []
24
+ end
25
+
26
+ def run?(record)
27
+ return false unless record.send("#{attribute}_changed?")
28
+
29
+ previous_value = record.send("#{attribute}_was")
30
+ current_value = record.send(attribute)
31
+
32
+ if expected_other_value != Nothing
33
+ if direction == :from && previous_value == expected_value && current_value == expected_other_value
34
+ return true
35
+ end
36
+
37
+ if direction == :to && current_value == expected_value && previous_value == expected_other_value
38
+ return true
39
+ end
40
+ else
41
+ if direction == :from && previous_value == expected_value
42
+ return true
43
+ end
44
+
45
+ if direction == :to && current_value == expected_value
46
+ return true
47
+ end
48
+ end
49
+
50
+ return false
51
+ end
52
+
53
+ end
54
+ end
@@ -0,0 +1,3 @@
1
+ module Changey
2
+ VERSION = '0.0.0'
3
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: changey
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Adam Cooke
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-03-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '4.2'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '6'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '4.2'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '6'
33
+ description: An Active Record extension to provide state callbacks
34
+ email:
35
+ - me@adamcooke.io
36
+ executables: []
37
+ extensions: []
38
+ extra_rdoc_files: []
39
+ files:
40
+ - lib/changey.rb
41
+ - lib/changey/block_dsl.rb
42
+ - lib/changey/dsl.rb
43
+ - lib/changey/railtie.rb
44
+ - lib/changey/track.rb
45
+ - lib/changey/version.rb
46
+ homepage: https://github.com/adamcooke/changey
47
+ licenses:
48
+ - MIT
49
+ metadata: {}
50
+ post_install_message:
51
+ rdoc_options: []
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ requirements: []
65
+ rubyforge_project:
66
+ rubygems_version: 2.4.5
67
+ signing_key:
68
+ specification_version: 4
69
+ summary: An Active Record extension to provide state callbacks
70
+ test_files: []
71
+ has_rdoc: