change_logger 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG ADDED
File without changes
data/MIT-LICENSE ADDED
File without changes
data/Manifest ADDED
@@ -0,0 +1,12 @@
1
+ CHANGELOG
2
+ MIT-LICENSE
3
+ Manifest
4
+ README
5
+ Rakefile
6
+ lib/app/models/change_log.rb
7
+ lib/change_logger.rb
8
+ lib/change_logger/acts_as_change_logger.rb
9
+ lib/change_logger/railtie.rb
10
+ lib/change_logger/whodunnit.rb
11
+ lib/generators/change_logger_generator.rb
12
+ lib/generators/templates/create_change_logs.rb
data/README ADDED
File without changes
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'echoe'
4
+
5
+ Echoe.new('change_logger', '0.0.1') do |p|
6
+ p.description = "A gem for tracking who and what changes"
7
+ p.url = "http://github.com/danengle/awesome_tables"
8
+ p.author = "Dan Engle"
9
+ p.email = "engle.68 @nospam@ gmail.com"
10
+ p.ignore_pattern = ["tmp/*", "script/*"]
11
+ p.development_dependencies = []
12
+ end
@@ -0,0 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{change_logger}
5
+ s.version = "0.0.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Dan Engle"]
9
+ s.cert_chain = ["/Users/danengle/.ssh/gem-public_cert.pem"]
10
+ s.date = %q{2010-12-02}
11
+ s.description = %q{A gem for tracking who and what changes}
12
+ s.email = %q{engle.68 @nospam@ gmail.com}
13
+ s.extra_rdoc_files = ["CHANGELOG", "README", "lib/app/models/change_log.rb", "lib/change_logger.rb", "lib/change_logger/acts_as_change_logger.rb", "lib/change_logger/railtie.rb", "lib/change_logger/whodunnit.rb", "lib/generators/change_logger_generator.rb", "lib/generators/templates/create_change_logs.rb"]
14
+ s.files = ["CHANGELOG", "MIT-LICENSE", "Manifest", "README", "Rakefile", "lib/app/models/change_log.rb", "lib/change_logger.rb", "lib/change_logger/acts_as_change_logger.rb", "lib/change_logger/railtie.rb", "lib/change_logger/whodunnit.rb", "lib/generators/change_logger_generator.rb", "lib/generators/templates/create_change_logs.rb", "change_logger.gemspec"]
15
+ s.homepage = %q{http://github.com/danengle/awesome_tables}
16
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Change_logger", "--main", "README"]
17
+ s.require_paths = ["lib"]
18
+ s.rubyforge_project = %q{change_logger}
19
+ s.rubygems_version = %q{1.3.7}
20
+ s.signing_key = %q{/Users/danengle/.ssh/gem-private_key.pem}
21
+ s.summary = %q{A gem for tracking who and what changes}
22
+
23
+ if s.respond_to? :specification_version then
24
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
25
+ s.specification_version = 3
26
+
27
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
28
+ else
29
+ end
30
+ else
31
+ end
32
+ end
@@ -0,0 +1,4 @@
1
+ class ChangeLog < ActiveRecord::Base
2
+ belongs_to :item, :polymorphic => true
3
+ validates_presence_of :item_id, :item_type, :attribute_name
4
+ end
@@ -0,0 +1,74 @@
1
+ module ChangeLogger
2
+ module ActsAsChangeLogger
3
+ ACTIONS = {
4
+ :create => 'CREATED',
5
+ :delete => 'DELETED'
6
+ }
7
+ def self.included(base)
8
+ base.send :extend, ChangeLogger::ActsAsChangeLogger::ClassMethods
9
+ end
10
+
11
+ module ClassMethods
12
+ def acts_as_change_logger(options = {})
13
+ send :include, InstanceMethods
14
+ cattr_accessor :ignore
15
+ self.ignore = (options[:ignore] || []).map &:to_s
16
+ self.ignore.push('created_at', 'updated_at')
17
+
18
+ has_many :change_logs, :as => :item, :order => 'change_logs.created_at desc'
19
+ after_save :record_attribute_updates
20
+ after_destroy :record_object_destruction
21
+ self.reflect_on_all_associations(:has_and_belongs_to_many).each do |reflection|
22
+ if reflection.options.keys.include?(:after_add) || reflection.options.keys.include?(:before_add)
23
+ logger.warn { "WARNING: change_logger adds after_add and after_remove options to has_and_belongs_to_many relationships. You need to combine your current methods with the record_association_* methods in order for change_logger to work correctly." }
24
+ end
25
+ new_options = { :after_add => :record_association_add, :after_remove => :record_association_remove }.merge(reflection.options)
26
+ has_and_belongs_to_many reflection.name.to_sym, new_options
27
+ end
28
+ end
29
+ end
30
+
31
+ module InstanceMethods
32
+
33
+ def record_association_add(object)
34
+ record_change(object.class.to_s, ACTIONS[:create], object.id)
35
+ end
36
+
37
+ def record_association_remove(object)
38
+ record_change(object.class.to_s, object.id, ACTIONS[:delete])
39
+ end
40
+
41
+ def record_attribute_updates
42
+ self.changes.delete_if { |k,v| self.class.ignore.include?(k) }.each do |key, value|
43
+ record_change(key, value[0], value[1])
44
+ end
45
+ end
46
+
47
+ def record_object_destruction
48
+ attributes.each do |key, value|
49
+ record_change(key, old_value(key), ACTIONS[:delete])
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ def old_value(attribute)
56
+ if self.new_record?
57
+ ACTIONS[:create]
58
+ else
59
+ send("#{key}_was")
60
+ end
61
+ end
62
+
63
+ def record_change(attribute_name, old_val, new_val)
64
+ self.change_logs.create!(
65
+ :attribute_name => attribute_name,
66
+ :old_value => old_val,
67
+ :new_value => new_val,
68
+ :changed_by_id => whodunnit.id
69
+ )
70
+ end
71
+ end
72
+ end
73
+ end
74
+ ActiveRecord::Base.send :include, ChangeLogger::ActsAsChangeLogger
@@ -0,0 +1,7 @@
1
+ # require 'change_logger'
2
+
3
+ # module ChangeLogger
4
+ # class Railtie < Rails::Railtie
5
+
6
+ # end
7
+ # end
@@ -0,0 +1,27 @@
1
+ module ChangeLogger
2
+ module Whodunnit
3
+
4
+ def self.included(base)
5
+ base.before_filter :set_whodunnit
6
+ end
7
+
8
+ protected
9
+
10
+ def whodunnit
11
+ current_user rescue nil
12
+ end
13
+
14
+ private
15
+
16
+ def set_whodunnit
17
+ ::ChangeLogger.whodunnit = whodunnit
18
+ end
19
+ end
20
+ end
21
+ ActionController::Base.send :include, ::ChangeLogger::Whodunnit
22
+
23
+ Kernel.module_eval do
24
+ def whodunnit
25
+ ::ChangeLogger.whodunnit
26
+ end
27
+ end
@@ -0,0 +1,31 @@
1
+ %w{ models }.each do |dir|
2
+ path = File.join(File.dirname(__FILE__), 'app', dir)
3
+ $LOAD_PATH << path
4
+ ActiveSupport::Dependencies.autoload_paths << path
5
+ ActiveSupport::Dependencies.autoload_once_paths.delete(path)
6
+ end
7
+
8
+ module ChangeLogger
9
+ def self.whodunnit
10
+ change_logger_store[:whodunnit]
11
+ end
12
+
13
+ def self.whodunnit=(value)
14
+ change_logger_store[:whodunnit] = value
15
+ end
16
+
17
+ private
18
+
19
+ # who knows about threads? why is this done this way?
20
+ def self.change_logger_store
21
+ Thread.current[:change_logger] ||= {}
22
+ end
23
+ end
24
+
25
+ require 'app/models/change_log'
26
+ require 'change_logger/whodunnit'
27
+ require 'change_logger/acts_as_change_logger'
28
+
29
+ # if defined?(::Rails::Railtie)
30
+ # require 'change_logger/railtie'
31
+ # end
@@ -0,0 +1,8 @@
1
+ class ChangeLoggerGenerator < Rails::Generators::Base
2
+ source_root File.expand_path("../templates", __FILE__)
3
+
4
+ desc "Create the change_logs migration file"
5
+ def copy_migration
6
+ copy_file "create_change_logs.rb", "db/migrate/#{Time.now.strftime("%Y%m%d%S")}_create_change_logs.rb"
7
+ end
8
+ end
@@ -0,0 +1,16 @@
1
+ class CreateChangeLogs < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :change_logs do |t|
4
+ t.integer :item_id, :null => false
5
+ t.string :item_type, :null => false
6
+ t.string :attribute_name, :old_value, :new_value
7
+ t.integer :changed_by_id, :null => false
8
+ t.timestamps
9
+ end
10
+ add_index :change_logs, [:item_type, :item_id]
11
+ end
12
+
13
+ def self.down
14
+ drop_table :change_logs
15
+ end
16
+ end
data.tar.gz.sig ADDED
@@ -0,0 +1 @@
1
+ i�ox�%�����:�]�ä05�Ǡ��vc�vU.dOūM��ӟ�ӵ�8�g���l�LΩ�A\GIʦ��|
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: change_logger
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Dan Engle
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain:
16
+ - |
17
+ -----BEGIN CERTIFICATE-----
18
+ MIIDMjCCAhqgAwIBAgIBADANBgkqhkiG9w0BAQUFADA/MREwDwYDVQQDDAhlbmds
19
+ ZS42ODEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYDY29t
20
+ MB4XDTEwMTAxMTAwNTI1M1oXDTExMTAxMTAwNTI1M1owPzERMA8GA1UEAwwIZW5n
21
+ bGUuNjgxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2Nv
22
+ bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKf6nWhdrlzcbME1sHRD
23
+ wbobJ/PfkZZeMmeOI00ij7gtpJ8/GTAHhDSazzNeQUaUJ01+g82QtRyDtXrsosj6
24
+ vV1HIGAIGESLcOi8vDqnUGZrmY/o3pO7cgYXbHjT9Jn/Uoqt9IXhE97Bf1mYyTvp
25
+ DznUjccAp+z/8N6xwOEgXqSCfMcfH1zyuurRo13PkJvEKkLAW+PsdA28xovauUXo
26
+ j2H8+myZLGi5KFeN13UnOo8x0t/McNYkjGaQcVBrIqqX4fle4LNakUfeyJoweXew
27
+ pAlIjByYtMDQT21fxQLthLayx35nuMXgMWC6+Evzx4U2M7D5GedSxbjZT3uzsHNR
28
+ pvkCAwEAAaM5MDcwCQYDVR0TBAIwADAdBgNVHQ4EFgQUt/Ysk6uU3ZrPbcD6kshs
29
+ ghx0mCYwCwYDVR0PBAQDAgSwMA0GCSqGSIb3DQEBBQUAA4IBAQB9gUK+9jS5asdp
30
+ cpDlY89APPt9dogKZbt7a8KRJu3qlVfcdW+/naxNOQdRtXspdUlsNdYUGJjJnV0K
31
+ hZ5TzDCKkH09nhpShLnTbwyB2srwRrMAZWpqvD2f6Muh8H5JB1lxe5RE1v1yZH7d
32
+ gokx0zsfVuIz2je+OeAz6qmfmiFQnG79vvSaQl6XsDdFsNf51Hdizt7fR1vC7MKr
33
+ 5ZNu0jDZxdAIsmHVdvJK7tMZWq8097ZatwhhE9ReA/ZoMBy4WK7k1G32K2AykCk7
34
+ in+c1BznEvMTAcQnwGUyalIFnODl9PB5tDyYYUJdPCPxe/YxL9csB3jNDxe6HrZK
35
+ 2MS0NMYj
36
+ -----END CERTIFICATE-----
37
+
38
+ date: 2010-12-02 00:00:00 -06:00
39
+ default_executable:
40
+ dependencies: []
41
+
42
+ description: A gem for tracking who and what changes
43
+ email: engle.68 @nospam@ gmail.com
44
+ executables: []
45
+
46
+ extensions: []
47
+
48
+ extra_rdoc_files:
49
+ - CHANGELOG
50
+ - README
51
+ - lib/app/models/change_log.rb
52
+ - lib/change_logger.rb
53
+ - lib/change_logger/acts_as_change_logger.rb
54
+ - lib/change_logger/railtie.rb
55
+ - lib/change_logger/whodunnit.rb
56
+ - lib/generators/change_logger_generator.rb
57
+ - lib/generators/templates/create_change_logs.rb
58
+ files:
59
+ - CHANGELOG
60
+ - MIT-LICENSE
61
+ - Manifest
62
+ - README
63
+ - Rakefile
64
+ - lib/app/models/change_log.rb
65
+ - lib/change_logger.rb
66
+ - lib/change_logger/acts_as_change_logger.rb
67
+ - lib/change_logger/railtie.rb
68
+ - lib/change_logger/whodunnit.rb
69
+ - lib/generators/change_logger_generator.rb
70
+ - lib/generators/templates/create_change_logs.rb
71
+ - change_logger.gemspec
72
+ has_rdoc: true
73
+ homepage: http://github.com/danengle/awesome_tables
74
+ licenses: []
75
+
76
+ post_install_message:
77
+ rdoc_options:
78
+ - --line-numbers
79
+ - --inline-source
80
+ - --title
81
+ - Change_logger
82
+ - --main
83
+ - README
84
+ require_paths:
85
+ - lib
86
+ required_ruby_version: !ruby/object:Gem::Requirement
87
+ none: false
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ segments:
92
+ - 0
93
+ version: "0"
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ segments:
100
+ - 1
101
+ - 2
102
+ version: "1.2"
103
+ requirements: []
104
+
105
+ rubyforge_project: change_logger
106
+ rubygems_version: 1.3.7
107
+ signing_key:
108
+ specification_version: 3
109
+ summary: A gem for tracking who and what changes
110
+ test_files: []
111
+
metadata.gz.sig ADDED
Binary file