appmospheres_audit 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +6 -0
- data/.rspec +1 -0
- data/CHANGELOG +8 -0
- data/Gemfile +4 -0
- data/MIT-LICENSE +20 -0
- data/README +24 -0
- data/Rakefile +6 -0
- data/TODO +3 -0
- data/appmospheres_audit.gemspec +32 -0
- data/lib/appmospheres_audit.rb +129 -0
- data/lib/appmospheres_audit/event_log.rb +5 -0
- data/lib/appmospheres_audit/version.rb +3 -0
- data/lib/generators/appmospheres_audit/config_generator.rb +16 -0
- data/lib/generators/appmospheres_audit/migration_generator.rb +43 -0
- data/lib/generators/appmospheres_audit/templates/active_record/migration.rb +24 -0
- data/lib/generators/appmospheres_audit/templates/config/appmospheres.rb +6 -0
- data/spec/appmospheres_audit/action_tracking_spec.rb +18 -0
- data/spec/appmospheres_audit/exception_logger_spec.rb +15 -0
- data/spec/appmospheres_audit/record_tracking_spec.rb +47 -0
- data/spec/fake_app.rb +65 -0
- data/spec/generators/appmospheres_audit/migration/migration_generator_spec.rb +27 -0
- data/spec/spec_helper.rb +13 -0
- data/spec/support/database_cleaner.rb +13 -0
- metadata +184 -0
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/CHANGELOG
ADDED
data/Gemfile
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2012 Appmospheres
|
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,24 @@
|
|
1
|
+
A gem for tracking model changes and controller actions.
|
2
|
+
|
3
|
+
USAGE
|
4
|
+
Run 'rails generate appmospheres_audit:migration' to generate the migration for the log events.
|
5
|
+
Run 'rails sappmospheres_audit:config' to generate a configuration initializer (in config/initializers/appmospheres_audit.rb).
|
6
|
+
|
7
|
+
Track models with enable_record_tracking:
|
8
|
+
class User < ActiveRecord::Base
|
9
|
+
enable_record_tracking
|
10
|
+
...
|
11
|
+
end
|
12
|
+
|
13
|
+
Track actions with enable_action_tracking:
|
14
|
+
class MyController < ApplicationController
|
15
|
+
enable_action_tracking
|
16
|
+
...
|
17
|
+
end
|
18
|
+
|
19
|
+
The payload of any event log record will be a YAML string. An event log tracking a model will record:
|
20
|
+
* on create: ID of the newly created record
|
21
|
+
* on update: list of changes (keys and values), excluding those explicitely filtered by setting Rails.application.config.filter_parameters and/or AppmospheresAudit.filter_parameters.
|
22
|
+
* on destroy: serialized record, excluding the attributes filtered by setting Rails.application.config.filter_parameters and/or AppmospheresAudit.filter_parameters.
|
23
|
+
|
24
|
+
Tracking actions in a controller will create an event log record with the name of the action and the parameters passed to the action, except those filtered by setting Rails.application.config.filter_parameters and/or AppmospheresAudit.filter_parameters.
|
data/Rakefile
ADDED
data/TODO
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "appmospheres_audit/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
|
7
|
+
s.name = "appmospheres_audit"
|
8
|
+
s.version = AppmospheresAudit::VERSION
|
9
|
+
s.authors = ["eugen neagoe", "Koen Handekyn"]
|
10
|
+
s.email = ["eugen.neagoe@appmospheres.com", "koen.handekyn@appmospheres.com"]
|
11
|
+
s.homepage = "https://github.com/appmospheres/appmospheres_audit"
|
12
|
+
s.summary = %q{A gem for tracking record changes and controller actions}
|
13
|
+
s.description = %q{A gem for tracking record changes and controller actions}
|
14
|
+
|
15
|
+
s.rubyforge_project = "appmospheres_audit"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.licenses = ['MIT']
|
23
|
+
|
24
|
+
s.add_dependency "rails", ">= 3.0.0"
|
25
|
+
|
26
|
+
s.add_development_dependency "ammeter"
|
27
|
+
s.add_development_dependency "database_cleaner"
|
28
|
+
s.add_development_dependency "rails", ">= 3.0.0"
|
29
|
+
s.add_development_dependency "rspec"
|
30
|
+
s.add_development_dependency "sqlite3"
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require "active_record"
|
2
|
+
require "action_controller"
|
3
|
+
|
4
|
+
require "appmospheres_audit/version"
|
5
|
+
require "appmospheres_audit/event_log"
|
6
|
+
|
7
|
+
module AppmospheresAudit
|
8
|
+
|
9
|
+
def self.configure
|
10
|
+
yield(self) if block_given?
|
11
|
+
end
|
12
|
+
|
13
|
+
class << self
|
14
|
+
|
15
|
+
# stores a hash of options given to the +configure+ block.
|
16
|
+
def options
|
17
|
+
@options ||= {}
|
18
|
+
end
|
19
|
+
|
20
|
+
# set or get the configuration parameters
|
21
|
+
def method_missing(symbol, *args)
|
22
|
+
if (method = symbol.to_s).sub!(/\=$/, '')
|
23
|
+
options[method.to_sym] = args.first
|
24
|
+
else
|
25
|
+
options[method.to_sym]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
module SupportTrail
|
32
|
+
|
33
|
+
def log_exception(ex)
|
34
|
+
begin
|
35
|
+
EventLog.create!(:event_type => ex.class.to_s, :action => "exception", :payload => ex.backtrace.to_yaml)
|
36
|
+
rescue
|
37
|
+
Rails.logger.warn "Could not log event 'exception' for #{ex.class.to_s}:#{ex.backtrace.inspect}" rescue nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
module RecordTrail
|
44
|
+
|
45
|
+
extend ActiveSupport::Concern
|
46
|
+
|
47
|
+
module ClassMethods
|
48
|
+
|
49
|
+
def enable_record_tracking
|
50
|
+
# set up after filters for create/update/destroy
|
51
|
+
after_create :track_create
|
52
|
+
after_update :track_update
|
53
|
+
after_destroy :track_destroy
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
def track_create
|
59
|
+
begin
|
60
|
+
EventLog.create!(:event_type => self.class.to_s, :action => "create", :payload => self.id.to_yaml)
|
61
|
+
rescue
|
62
|
+
Rails.logger.warn "Could not log event 'create' for #{self.class.to_s}:#{self.id}" rescue true
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def track_update
|
67
|
+
begin
|
68
|
+
filtered_params = Rails.application.config.filter_parameters + (AppmospheresAudit.filter_parameters || [])
|
69
|
+
EventLog.create!(:event_type => self.class.to_s, :action => "update",
|
70
|
+
:payload => self.changes.merge({:id => self.id}).except(*filtered_params).to_yaml)
|
71
|
+
rescue
|
72
|
+
Rails.logger.warn "Could not log event 'update' for #{self.class.to_s}:#{self.changes.inspect}" rescue true
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def track_destroy
|
77
|
+
begin
|
78
|
+
filtered_params = Rails.application.config.filter_parameters + (AppmospheresAudit.filter_parameters || [])
|
79
|
+
EventLog.create!(:event_type => self.class.to_s, :action => "destroy", :payload => self.serializable_hash.except(*filtered_params.map(&:to_s)).to_yaml)
|
80
|
+
rescue
|
81
|
+
Rails.logger.warn "Could not log event 'destroy' for #{self.class.to_s}:#{self.inspect}" rescue true
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
module ControllerTrail
|
88
|
+
|
89
|
+
def self.included(base)
|
90
|
+
base.extend ClassMethods
|
91
|
+
base.send :include, AppmospheresAudit::SupportTrail
|
92
|
+
end
|
93
|
+
|
94
|
+
module ClassMethods
|
95
|
+
|
96
|
+
def enable_action_tracking
|
97
|
+
around_filter do |controller, action|
|
98
|
+
begin
|
99
|
+
begin
|
100
|
+
filtered_actions = AppmospheresAudit.filter_actions || []
|
101
|
+
unless filtered_actions.include?(controller.action_name.to_sym) || filtered_actions.include?(controller.action_name)
|
102
|
+
filtered_params = Rails.application.config.filter_parameters + (AppmospheresAudit.filter_parameters || [])
|
103
|
+
EventLog.create!(:event_type => 'controller', :action => controller.request.parameters[:action],
|
104
|
+
:payload => controller.request.parameters.except(*filtered_params).to_yaml)
|
105
|
+
end
|
106
|
+
rescue
|
107
|
+
Rails.logger.warn "tracked #{controller.request.parameters.inspect}" rescue nil
|
108
|
+
end
|
109
|
+
action.call
|
110
|
+
rescue Exception => e
|
111
|
+
log_exception(e)
|
112
|
+
raise # again, so the execution continues as intended by the app
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
ActiveRecord::Base.class_eval do
|
124
|
+
include AppmospheresAudit::RecordTrail
|
125
|
+
end
|
126
|
+
|
127
|
+
ActionController::Base.class_eval do
|
128
|
+
include AppmospheresAudit::ControllerTrail
|
129
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
|
3
|
+
module AppmospheresAudit
|
4
|
+
|
5
|
+
class ConfigGenerator < Rails::Generators::Base
|
6
|
+
|
7
|
+
source_root File.expand_path(File.dirname(__FILE__))
|
8
|
+
|
9
|
+
desc "Adds a config initializer to config/initializers/appmospheres.rb"
|
10
|
+
def copy_files
|
11
|
+
template 'templates/config/appmospheres.rb', 'config/initializers/appmospheres_audit.rb'
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
require 'rails/generators/migration'
|
3
|
+
|
4
|
+
module AppmospheresAudit
|
5
|
+
|
6
|
+
class MigrationGenerator < Rails::Generators::Base
|
7
|
+
|
8
|
+
include Rails::Generators::Migration
|
9
|
+
|
10
|
+
desc "Generates migration for the EventLog model"
|
11
|
+
|
12
|
+
def self.orm
|
13
|
+
Rails::Generators.options[:rails][:orm]
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.source_root
|
17
|
+
File.join(File.dirname(__FILE__), 'templates', (orm.to_s unless orm.class.eql?(String)) )
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.orm_has_migration?
|
21
|
+
[:active_record].include? orm
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.next_migration_number(dirname)
|
25
|
+
if ActiveRecord::Base.timestamped_migrations
|
26
|
+
migration_number = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
|
27
|
+
migration_number += 1
|
28
|
+
migration_number.to_s
|
29
|
+
else
|
30
|
+
"%.3d" % (current_migration_number(dirname) + 1)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def create_migration_file
|
35
|
+
if self.class.orm_has_migration?
|
36
|
+
migration_template 'migration.rb', 'db/migrate/appmospheres_audit_migration'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class AppmospheresAuditMigration < ActiveRecord::Migration
|
2
|
+
|
3
|
+
def self.up
|
4
|
+
|
5
|
+
create_table :event_logs do |t|
|
6
|
+
t.string :event_type
|
7
|
+
t.string :action
|
8
|
+
t.text :payload
|
9
|
+
|
10
|
+
t.datetime :reported_at
|
11
|
+
t.timestamps
|
12
|
+
end
|
13
|
+
|
14
|
+
add_index :event_logs, :event_type
|
15
|
+
add_index :event_logs, :action
|
16
|
+
add_index :event_logs, :reported_at
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.down
|
21
|
+
drop_table :event_logs
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AppmospheresAudit::ControllerTrail do
|
4
|
+
|
5
|
+
describe "enable_action_tracking", :type => :request do
|
6
|
+
|
7
|
+
it "should record every controller action when enabled" do
|
8
|
+
expect { get '/users' }.to change(EventLog, :count).by(1)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should not track filtered actions" do
|
12
|
+
AppmospheresAudit.filter_actions = [:index]
|
13
|
+
expect { get '/users' }.not_to change(EventLog, :count)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AppmospheresAudit::SupportTrail do
|
4
|
+
|
5
|
+
describe 'log_exception' do
|
6
|
+
|
7
|
+
include AppmospheresAudit::SupportTrail
|
8
|
+
|
9
|
+
it "should create an event log record" do
|
10
|
+
expect { log_exception(Exception.new) }.to change(EventLog, :count).by(1)
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AppmospheresAudit::RecordTrail do
|
4
|
+
|
5
|
+
describe "enable_record_tracking" do
|
6
|
+
|
7
|
+
before(:each) { User.create! }
|
8
|
+
|
9
|
+
describe "create" do
|
10
|
+
it "should create an event log when a new record is created" do
|
11
|
+
expect { User.create! }.to change(EventLog, :count).by(1)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "update" do
|
16
|
+
|
17
|
+
it "should create an event log when a record is updated" do
|
18
|
+
expect { User.first.update_attribute(:name, "") }.to change(EventLog, :count).by(1)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should not include filtered parameters in the event log payload" do
|
22
|
+
AppmospheresAudit.filter_parameters = [:name]
|
23
|
+
User.first.update_attribute(:name, "changed")
|
24
|
+
changes = YAML::load(EventLog.where(:event_type => 'User', :action => 'update').last.payload)
|
25
|
+
changes.should_not include(:name)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "destroy" do
|
31
|
+
|
32
|
+
it "should create an event log when a record is deleted" do
|
33
|
+
expect { User.first.destroy }.to change(EventLog, :count).by(1)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should not include filtered parameters in the event log payload" do
|
37
|
+
AppmospheresAudit.filter_parameters = [:name]
|
38
|
+
User.first.destroy
|
39
|
+
record = YAML::load(EventLog.where(:event_type => 'User', :action => 'destroy').last.payload)
|
40
|
+
record.should_not include(:name)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
data/spec/fake_app.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require 'action_controller/railtie'
|
3
|
+
require 'action_view/railtie'
|
4
|
+
|
5
|
+
# database
|
6
|
+
ActiveRecord::Base.configurations = {'test' => {:adapter => 'sqlite3', :database => ':memory:'}}
|
7
|
+
ActiveRecord::Base.establish_connection('test')
|
8
|
+
|
9
|
+
# config
|
10
|
+
app = Class.new(Rails::Application)
|
11
|
+
app.config.secret_token = "fada08cee25221c8f94cd4469710c402fc40c4100a2f72f101f18233002f7016fc7004c09e68e201dbcf1bf92d5bfec98638ac239590980352e56b406dc50286"
|
12
|
+
app.config.session_store :cookie_store, :key => "_myfakeapp_session"
|
13
|
+
app.config.active_support.deprecation = :log
|
14
|
+
app.initialize!
|
15
|
+
|
16
|
+
# routes
|
17
|
+
app.routes.draw do
|
18
|
+
resources :users
|
19
|
+
end
|
20
|
+
|
21
|
+
# models
|
22
|
+
class User < ActiveRecord::Base
|
23
|
+
enable_record_tracking
|
24
|
+
end
|
25
|
+
|
26
|
+
# controllers
|
27
|
+
class ApplicationController < ActionController::Base
|
28
|
+
enable_action_tracking
|
29
|
+
end
|
30
|
+
class UsersController < ApplicationController
|
31
|
+
def index
|
32
|
+
@users = User.all
|
33
|
+
render :inline => <<-ERB
|
34
|
+
<%= @users.map(&:name).join("\n") %>
|
35
|
+
ERB
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# helpers
|
40
|
+
Object.const_set(:ApplicationHelper, Module.new)
|
41
|
+
|
42
|
+
#migrations
|
43
|
+
class CreateAllTables < ActiveRecord::Migration
|
44
|
+
|
45
|
+
def self.up
|
46
|
+
|
47
|
+
create_table(:users) {|t| t.string :name }
|
48
|
+
|
49
|
+
create_table :event_logs do |t|
|
50
|
+
t.string :event_type
|
51
|
+
t.string :action
|
52
|
+
t.text :payload
|
53
|
+
|
54
|
+
t.datetime :reported_at
|
55
|
+
t.timestamps
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.down
|
61
|
+
drop_table :event_logs
|
62
|
+
drop_table :users
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# Generators are not automatically loaded by Rails
|
4
|
+
require 'generators/appmospheres_audit/migration_generator'
|
5
|
+
|
6
|
+
describe AppmospheresAudit::MigrationGenerator do
|
7
|
+
|
8
|
+
# Tell the generator where to put its output (what it thinks of as Rails.root)
|
9
|
+
destination File.expand_path("../../../../../tmp", __FILE__)
|
10
|
+
|
11
|
+
before do
|
12
|
+
prepare_destination
|
13
|
+
Rails::Generators.options[:rails][:orm] = :active_record
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'no arguments' do
|
17
|
+
|
18
|
+
before { run_generator }
|
19
|
+
|
20
|
+
describe 'db/migrate/appmospheres_audit_migration.rb' do
|
21
|
+
subject { file('db/migrate/appmospheres_audit_migration.rb') }
|
22
|
+
it { should be_a_migration }
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
$LOAD_PATH << "." unless $LOAD_PATH.include?(".")
|
2
|
+
require 'rails'
|
3
|
+
require File.expand_path('../../lib/appmospheres_audit', __FILE__)
|
4
|
+
require 'ammeter/init'
|
5
|
+
require 'database_cleaner'
|
6
|
+
require 'fake_app'
|
7
|
+
require 'rspec/rails'
|
8
|
+
|
9
|
+
RSpec.configure do |config|
|
10
|
+
config.before :all do
|
11
|
+
CreateAllTables.up unless ActiveRecord::Base.connection.table_exists? :users
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
DatabaseCleaner.strategy = :transaction
|
2
|
+
|
3
|
+
RSpec.configure do |config|
|
4
|
+
config.before :suite do
|
5
|
+
DatabaseCleaner.clean_with :truncation
|
6
|
+
end
|
7
|
+
config.before :each do
|
8
|
+
DatabaseCleaner.start
|
9
|
+
end
|
10
|
+
config.after :each do
|
11
|
+
DatabaseCleaner.clean
|
12
|
+
end
|
13
|
+
end
|
metadata
ADDED
@@ -0,0 +1,184 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: appmospheres_audit
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 31
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 2
|
10
|
+
version: 0.1.2
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- eugen neagoe
|
14
|
+
- Koen Handekyn
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2012-02-27 00:00:00 Z
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rails
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 7
|
30
|
+
segments:
|
31
|
+
- 3
|
32
|
+
- 0
|
33
|
+
- 0
|
34
|
+
version: 3.0.0
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: ammeter
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 3
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
version: "0"
|
49
|
+
type: :development
|
50
|
+
version_requirements: *id002
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
name: database_cleaner
|
53
|
+
prerelease: false
|
54
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 3
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
version: "0"
|
63
|
+
type: :development
|
64
|
+
version_requirements: *id003
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: rails
|
67
|
+
prerelease: false
|
68
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
hash: 7
|
74
|
+
segments:
|
75
|
+
- 3
|
76
|
+
- 0
|
77
|
+
- 0
|
78
|
+
version: 3.0.0
|
79
|
+
type: :development
|
80
|
+
version_requirements: *id004
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: rspec
|
83
|
+
prerelease: false
|
84
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
hash: 3
|
90
|
+
segments:
|
91
|
+
- 0
|
92
|
+
version: "0"
|
93
|
+
type: :development
|
94
|
+
version_requirements: *id005
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: sqlite3
|
97
|
+
prerelease: false
|
98
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
hash: 3
|
104
|
+
segments:
|
105
|
+
- 0
|
106
|
+
version: "0"
|
107
|
+
type: :development
|
108
|
+
version_requirements: *id006
|
109
|
+
description: A gem for tracking record changes and controller actions
|
110
|
+
email:
|
111
|
+
- eugen.neagoe@appmospheres.com
|
112
|
+
- koen.handekyn@appmospheres.com
|
113
|
+
executables: []
|
114
|
+
|
115
|
+
extensions: []
|
116
|
+
|
117
|
+
extra_rdoc_files: []
|
118
|
+
|
119
|
+
files:
|
120
|
+
- .gitignore
|
121
|
+
- .rspec
|
122
|
+
- CHANGELOG
|
123
|
+
- Gemfile
|
124
|
+
- MIT-LICENSE
|
125
|
+
- README
|
126
|
+
- Rakefile
|
127
|
+
- TODO
|
128
|
+
- appmospheres_audit.gemspec
|
129
|
+
- lib/appmospheres_audit.rb
|
130
|
+
- lib/appmospheres_audit/event_log.rb
|
131
|
+
- lib/appmospheres_audit/version.rb
|
132
|
+
- lib/generators/appmospheres_audit/config_generator.rb
|
133
|
+
- lib/generators/appmospheres_audit/migration_generator.rb
|
134
|
+
- lib/generators/appmospheres_audit/templates/active_record/migration.rb
|
135
|
+
- lib/generators/appmospheres_audit/templates/config/appmospheres.rb
|
136
|
+
- spec/appmospheres_audit/action_tracking_spec.rb
|
137
|
+
- spec/appmospheres_audit/exception_logger_spec.rb
|
138
|
+
- spec/appmospheres_audit/record_tracking_spec.rb
|
139
|
+
- spec/fake_app.rb
|
140
|
+
- spec/generators/appmospheres_audit/migration/migration_generator_spec.rb
|
141
|
+
- spec/spec_helper.rb
|
142
|
+
- spec/support/database_cleaner.rb
|
143
|
+
homepage: https://github.com/appmospheres/appmospheres_audit
|
144
|
+
licenses:
|
145
|
+
- MIT
|
146
|
+
post_install_message:
|
147
|
+
rdoc_options: []
|
148
|
+
|
149
|
+
require_paths:
|
150
|
+
- lib
|
151
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
152
|
+
none: false
|
153
|
+
requirements:
|
154
|
+
- - ">="
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
hash: 3
|
157
|
+
segments:
|
158
|
+
- 0
|
159
|
+
version: "0"
|
160
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ">="
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
hash: 3
|
166
|
+
segments:
|
167
|
+
- 0
|
168
|
+
version: "0"
|
169
|
+
requirements: []
|
170
|
+
|
171
|
+
rubyforge_project: appmospheres_audit
|
172
|
+
rubygems_version: 1.8.17
|
173
|
+
signing_key:
|
174
|
+
specification_version: 3
|
175
|
+
summary: A gem for tracking record changes and controller actions
|
176
|
+
test_files:
|
177
|
+
- spec/appmospheres_audit/action_tracking_spec.rb
|
178
|
+
- spec/appmospheres_audit/exception_logger_spec.rb
|
179
|
+
- spec/appmospheres_audit/record_tracking_spec.rb
|
180
|
+
- spec/fake_app.rb
|
181
|
+
- spec/generators/appmospheres_audit/migration/migration_generator_spec.rb
|
182
|
+
- spec/spec_helper.rb
|
183
|
+
- spec/support/database_cleaner.rb
|
184
|
+
has_rdoc:
|