change_log 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Binary file
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 PETER ZHANG
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,69 @@
1
+ h1. Change Log
2
+
3
+ A gem to keep all maintenances in database
4
+
5
+
6
+ h2. Install Change Log Gem
7
+ 1. command:
8
+ <pre><code># gem install change_log</code</pre>
9
+
10
+ 2. bundler
11
+ <pre><code>
12
+ # Gemfile in your application
13
+ gem 'change_log','0.0.1'
14
+ </code</pre>
15
+ then:
16
+ <pre><code>
17
+ bundle install
18
+ </code</pre>
19
+
20
+ h2. Create a table to keep all maintenance logs
21
+
22
+ 1. generate a migration file
23
+
24
+ <pre><code>
25
+ class AddChangeLog < ActiveRecord::Migration
26
+ def self.up
27
+ create_table :change_log do |t|
28
+ t.integer :version, :null=>false # store version of each change
29
+ t.string :record_id,:limit=>30 # store the actual record id
30
+ t.string :table_name, :limti=>60 # store the table name
31
+ t.string :attribute_name,:limit=>60 # store the column name
32
+ t.string :user, :limit=>20 # store the user who made the change
33
+ t.string :action, :limit=>6 # store the change action: create, read, update, delete
34
+ t.text :old_value # the value before change
35
+ t.text :new_value # value after change
36
+ t.string :field_type, :limit=>30 # the column type eg. date, text, varchar, int etc
37
+ t.timestamps
38
+ end
39
+ end
40
+
41
+ def self.down
42
+ drop_table :change_log
43
+ end
44
+ end
45
+ </code></pre>
46
+
47
+ Then:
48
+ <pre><code>rake db:migrate</code></pre>
49
+
50
+ h2. Use Change Log
51
+ 1. Add current_user method in application_controller.rb
52
+ <pre><code>
53
+ # used by change log
54
+ def current_user # :nodoc:
55
+ return session[:user] # replace this with your own code to tell change_log who is the current user
56
+ end
57
+ </code></pre>
58
+
59
+ h2. Testing
60
+ TODO::
61
+
62
+
63
+ Author
64
+ ------
65
+
66
+ Peter Zhang at NCS New Zealand.
67
+ Email: peterz@ncs.co.nz
68
+
69
+ Copyright (c) 2011 Peter Zhang, released under the MIT license
@@ -0,0 +1,11 @@
1
+ module ChangeLog
2
+ class Config
3
+ include Singleton
4
+ attr_accessor :enabled
5
+
6
+ def initialize
7
+ # Indicates whether ChangeLog is on or off.
8
+ @enabled = true
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,29 @@
1
+ module ChangeLog
2
+ module Controller
3
+
4
+ def self.included(base)
5
+ base.before_filter :set_change_log_whodidit
6
+ end
7
+
8
+ protected
9
+
10
+ # Returns the user who is responsible for any changes that occur.
11
+ # By default this calls `current_user` and returns the result.
12
+ #
13
+ # Override this method in your controller to call a different
14
+ # method, e.g. `current_login_user`, or anything.
15
+ def user_for_change_log
16
+ current_user rescue nil
17
+ end
18
+
19
+ private
20
+
21
+ # Tells ChangeLog who is responsible for any changes.
22
+ def set_change_log_whodidit
23
+ ::ChangeLog.whodidit = user_for_change_log
24
+ end
25
+
26
+ end
27
+ end
28
+
29
+ ActionController::Base.send :include, ChangeLog::Controller
@@ -0,0 +1,99 @@
1
+ module ChangeLog
2
+ module Model
3
+
4
+ def self.included(base)
5
+ base.send :extend, ClassMethods
6
+ end
7
+
8
+
9
+ module ClassMethods
10
+ # Declare this in your model to keep a change log for every create, update, and destroy.
11
+ #
12
+ # Options:
13
+ # :ignore an array of attributes will be ingored when saving changes into change log.
14
+ def enable_change_log(options = {})
15
+ send :include, InstanceMethods
16
+
17
+ cattr_accessor :ignore, :whodidit
18
+ self.ignore = (options[:ignore] || []).map &:to_s
19
+
20
+ # Indicates whether or not ChangeLog is active for this class.
21
+ # This is independent of whether ChangeLog is globally enabled or disabled.
22
+ cattr_accessor :change_log_active
23
+ self.change_log_active = true
24
+
25
+ after_create :record_create
26
+ before_update :record_update
27
+ after_destroy :record_destroy
28
+ end
29
+
30
+ # Switches ChangeLog off for this class.
31
+ def change_log_off
32
+ self.change_log_active = false
33
+ end
34
+
35
+ # Switches ChangeLog on for this class.
36
+ def change_log_on
37
+ self.change_log_active = true
38
+ end
39
+ end
40
+
41
+ # Wrap the following methods in a module so we can include them only in the
42
+ # ActiveRecord models that declare `enable_change_log`.
43
+ module InstanceMethods
44
+ def record_create
45
+ # do nothing if the change log is not turned on
46
+ return '' unless switched_on?
47
+ # saving changes to maintenance log
48
+ self.attributes.map do |key,value|
49
+ unless self.ignore.include?(key.to_sym)
50
+ option = {:action=>'INSERT', :record_id=>self.id,:table_name=>self.class.table_name, :user=>ChangeLog.whodidit,:attribute_name=>key,:new_value=>value,:version=>1}
51
+ Maintenance.update_maintenance_record_with(option)
52
+ end
53
+ end
54
+ end
55
+
56
+ def record_update
57
+ # do nothing if the change log is not turned on and no changes has been made
58
+ return '' unless switched_on? && self.valid? && self.changed?
59
+
60
+ self.changes.each do |attribute_name,value|
61
+ # do not record changes between nil <=> ''
62
+ # and ignore the changes for ignored columns
63
+ unless value[1].eql?(value[0]) || (value[1].blank?&&value[0].blank?) || self.ignore.include?(attribute_name.to_s)
64
+ option = {:action=>'UPDATE',:record_id=>self.id,:table_name=>self.class.table_name,:user=>ChangeLog.whodidit,:attribute_name=>attribute_name,:old_value=>value[0],:new_value=>value[1],:version => Maintenance.get_version_number(self.id,self.class.table_name)}
65
+ Maintenance.update_maintenance_record_with(option)
66
+ end
67
+ end
68
+ end
69
+
70
+ def record_destroy
71
+ return '' unless switched_on?
72
+ Maintenance.update_maintenance_record_with({:action=>'DELETE',:table_name=>self.class.table_name,:record_id=>self.id,:user=>ChangeLog.whodidit,:version => Maintenance.get_version_number(self.id,self.class.table_name)})
73
+ end
74
+
75
+ # Return a list of maintenance records
76
+ # Return empty array if not record found
77
+ def change_logs
78
+ return Maintenance.find(:all,:conditions=>['table_name= ? and record_id = ?',self.class.table_name,self.id],:order=>"created_at DESC")
79
+ end
80
+
81
+ # Return `true` if current record has a list of maintenance records
82
+ # otherwise `false`.
83
+ def has_change_log?
84
+ return (Maintenance.count(:conditions=>['table_name= ? and record_id = ?',self.class.table_name,self.id]) > 0) ? true : false
85
+ end
86
+
87
+ private
88
+
89
+ # Returns `true` if ChangeLog is globally enabled and active for this class,
90
+ # `false` otherwise.
91
+ def switched_on?
92
+ ChangeLog.enabled? && self.class.change_log_active
93
+ end
94
+ end
95
+
96
+ end
97
+ end
98
+
99
+ ActiveRecord::Base.send :include, ChangeLog::Model
@@ -0,0 +1,30 @@
1
+ class Maintenance < ActiveRecord::Base
2
+ # Set table name to "change_logs"
3
+ set_table_name 'change_logs'
4
+
5
+ private
6
+
7
+ # Save maintenance details when options
8
+ def self.update_maintenance_record_with(option={})
9
+ record = Maintenance.new(option)
10
+ record.field_type = get_field_type(option[:table_name],option[:attribute_name]) unless option[:action].eql?('DELETE')
11
+ record.created_at = Time.now
12
+ record.save
13
+ end
14
+
15
+ # return the lastest version number for this change
16
+ def self.get_version_number(id,table_name)
17
+ latest_version = Maintenance.maximum(:version,:conditions=>['record_id = ? and table_name = ?',id,table_name])
18
+ return latest_version.nil? ? 1 : latest_version.next
19
+ end
20
+
21
+ def self.get_field_type(table_name,field_name)
22
+ return 'Error' if table_name.blank?||field_name.blank?
23
+ ActiveRecord::Base.connection.columns(table_name).each do |field|
24
+ return field.sql_type if field.name.eql?(field_name)
25
+ end
26
+ rescue
27
+ return 'Error'
28
+ end
29
+
30
+ end
@@ -1,3 +1,3 @@
1
1
  module ChangeLog
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: change_log
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Peter Zhang
@@ -42,11 +42,18 @@ extensions: []
42
42
  extra_rdoc_files: []
43
43
 
44
44
  files:
45
+ - .change_log.gemspec.un~
45
46
  - .gitignore
46
47
  - Gemfile
48
+ - MIT-LICENSE
49
+ - README
47
50
  - Rakefile
48
51
  - change_log.gemspec
49
52
  - lib/change_log.rb
53
+ - lib/change_log/config.rb
54
+ - lib/change_log/controller.rb
55
+ - lib/change_log/has_change_log.rb
56
+ - lib/change_log/maintenance.rb
50
57
  - lib/change_log/version.rb
51
58
  has_rdoc: true
52
59
  homepage: http://www.ncs.co.nz