alfuken-simple_audit 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 [name of plugin creator]
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.
@@ -0,0 +1,23 @@
1
+ MIT-LICENSE
2
+ README
3
+ Rakefile
4
+ app/controllers/audits_controller.rb
5
+ app/helpers/layout_helper.rb
6
+ app/models/audit.rb
7
+ app/views/audits/_form.html.erb
8
+ app/views/audits/edit.html.erb
9
+ app/views/audits/index.html.erb
10
+ app/views/audits/new.html.erb
11
+ app/views/audits/show.html.erb
12
+ generators/simple_audit/USAGE
13
+ generators/simple_audit/simple_audit_generator.rb
14
+ generators/simple_audit/templates/migration.rb
15
+ init.rb
16
+ install.rb
17
+ lib/db/migrate/20090908101900_create_audits.rb
18
+ lib/simple_audit.rb
19
+ tasks/simple_audit_tasks.rake
20
+ test/simple_audit_test.rb
21
+ test/test_helper.rb
22
+ uninstall.rb
23
+ Manifest
data/README ADDED
@@ -0,0 +1,16 @@
1
+ SimpleAudit
2
+ ===========
3
+
4
+ Simple auditing plugin, just testing some stuff.
5
+ Not for production use!
6
+
7
+
8
+ Example
9
+ =======
10
+
11
+ ./script/generate simple_audit install
12
+ rake db:migrate
13
+ url localhost:3000/audits
14
+
15
+
16
+ Copyright (c) 2009 Alfuken, released under the MIT license
@@ -0,0 +1,50 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'echoe'
4
+
5
+ Echoe.new('simple_audit', '0.0.1') do |p|
6
+ p.description = "Simple auditing plugin."
7
+ p.url = "http://github.com/alfuken/"
8
+ p.author = "Alfuken"
9
+ p.email = "alfuken@gmail.com"
10
+ p.development_dependencies = []
11
+ end
12
+
13
+ Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
14
+
15
+ # ---------------------------------------------
16
+ # require 'rubygems'
17
+ # require 'rake'
18
+ #
19
+ # PKG_FILES = FileList[
20
+ # '[a-zA-Z]*',
21
+ # 'app/**/*',
22
+ # 'app/**/**/*',
23
+ # 'generators/**/*',
24
+ # 'generators/**/**/*',
25
+ # 'lib/*',
26
+ # 'lib/**/*',
27
+ # 'lib/**/**/*',
28
+ # # 'rails/**/*',
29
+ # 'tasks/**/*',
30
+ # # 'test/**/*'
31
+ # ]
32
+ #
33
+ # spec = Gem::Specification.new do |s|
34
+ # s.name = "alfuken-simple_audit"
35
+ # s.version = "0.0.1"
36
+ # s.author = "Alfuken"
37
+ # s.email = "alfuken@gmail.com"
38
+ # s.homepage = "http://github.com/alfuken/"
39
+ # s.platform = Gem::Platform::RUBY
40
+ # s.summary = "Simple auditing plugin."
41
+ # s.files = PKG_FILES.to_a
42
+ # s.require_path = "lib"
43
+ # s.has_rdoc = false
44
+ # s.extra_rdoc_files = ["README"]
45
+ # end
46
+ #
47
+ # desc 'Turn this plugin into a gem.'
48
+ # Rake::GemPackageTask.new(spec) do |pkg|
49
+ # pkg.gem_spec = spec
50
+ # end
@@ -0,0 +1,99 @@
1
+ class AuditsController < ApplicationController
2
+ unloadable
3
+ def index
4
+ # проверяем, сущевствует ли заданная column, по которой юзер хочет делать сортировку
5
+ @columns = ActiveRecord::Base.connection.columns('audits').map {|c| c.name}
6
+ @order_by = @columns.include?(params[:order_by]) ? params[:order_by] : "created_at"
7
+
8
+ # выбираем сортировку, опять же чтобы не подсунули "order_by foobar fesc" вместо "desc"
9
+ @sort_order = ['asc', 'desc'].include?(params[:sort_order]) ? params[:sort_order] : 'desc'
10
+
11
+ # Привычка объявлять переменные в некоторых случаях
12
+ conditions = {}
13
+ filter_texts = []
14
+
15
+ # Запрос фильтрации по ресурсу
16
+ if params[:resource]
17
+ filter_texts << "resource &ldquo;#{params[:resource]}&rdquo;"
18
+ conditions.merge!({:resource => params[:resource] })
19
+ end
20
+
21
+ # Запрос фильтрации по пользователю
22
+ if params[:user_id]
23
+ filter_texts << "user &ldquo;#{User.find(params[:user_id]).login}&rdquo;"
24
+ conditions.merge!({:user_id => params[:user_id] })
25
+ end
26
+
27
+ # Сообщаем, что включен фильтр
28
+ @mssg = "Filtered by #{filter_texts.to_sentence}" unless filter_texts.empty?
29
+
30
+ # hady thingie: выводим список ресурсов, которые мы можем пофильтровать
31
+ @resources_to_filter_on = Audit.all(:group => 'resource').map {|r| r.resource}
32
+
33
+ # просто фикс для более приятной сортировки (по запрошеному полю + по времени)
34
+ fix = params[:order_by] == "created_at" ? "" : ", created_at desc"
35
+ @audits = Audit.find(:all, :conditions => conditions, :order => "#{@order_by} #{@sort_order}#{fix}", :include => :user).paginate :page => params[:page], :per_page => 10
36
+
37
+ # тут и далее объяснения излишни
38
+ respond_to do |format|
39
+ format.html
40
+ format.xml { render :xml => @audits }
41
+ format.js { render :json => @audits }
42
+ end
43
+
44
+ end
45
+
46
+ def show
47
+ @audit = Audit.find(params[:id])
48
+ respond_to do |format|
49
+ format.html
50
+ format.xml { render :xml => @audit }
51
+ format.js { render :json => @audit }
52
+ end
53
+ end
54
+
55
+ # @resource_actions = Audit.find_all_by_resource(params[:show_only], :group_by => 'resource').map {|r| r.action}
56
+ # conds = ["'#{params[:filter_by]}' = ? AND 'action' IN (?)", params[:show_only], @resource_actions ]
57
+
58
+ # def new
59
+ # @audit = Audit.new
60
+ # end
61
+
62
+ # def create
63
+ # @audit = Audit.new(params[:audit])
64
+ # if @audit.save
65
+ # flash[:notice] = "Successfully created audit."
66
+ # redirect_to @audit
67
+ # else
68
+ # render :action => 'new'
69
+ # end
70
+ # end
71
+
72
+ # def edit
73
+ # @audit = Audit.find(params[:id])
74
+ # end
75
+
76
+ # def update
77
+ # @audit = Audit.find(params[:id])
78
+ # if @audit.update_attributes(params[:audit])
79
+ # flash[:notice] = "Successfully updated audit."
80
+ # redirect_to @audit
81
+ # else
82
+ # render :action => 'edit'
83
+ # end
84
+ # end
85
+
86
+ def destroy
87
+ @audit = Audit.find(params[:id])
88
+ @audit.destroy
89
+ respond_to do |format|
90
+ format.html {
91
+ flash[:notice] = "Successfully destroyed audit."
92
+ redirect_to audits_url
93
+ }
94
+ format.xml { head :ok }
95
+ format.js { head :ok }
96
+ end
97
+ end
98
+
99
+ end
@@ -0,0 +1,22 @@
1
+ # These helper methods can be called in your template to set variables to be used in the layout
2
+ # This module should be included in all views globally,
3
+ # to do so you may need to add this line to your ApplicationController
4
+ # helper :layout
5
+ module LayoutHelper
6
+ def title(page_title, show_title = true)
7
+ @content_for_title = page_title.to_s
8
+ @show_title = show_title
9
+ end
10
+
11
+ def show_title?
12
+ @show_title
13
+ end
14
+
15
+ def stylesheet(*args)
16
+ content_for(:head) { stylesheet_link_tag(*args) }
17
+ end
18
+
19
+ def javascript(*args)
20
+ content_for(:head) { javascript_include_tag(*args) }
21
+ end
22
+ end
@@ -0,0 +1,3 @@
1
+ class Audit < ActiveRecord::Base
2
+ belongs_to :user
3
+ end
@@ -0,0 +1,20 @@
1
+ <% form_for @audit do |f| %>
2
+ <%= f.error_messages %>
3
+ <p>
4
+ <%= f.label :user_id %><br />
5
+ <%= f.text_field :user_id %>
6
+ </p>
7
+ <p>
8
+ <%= f.label :resource %><br />
9
+ <%= f.text_field :resource %>
10
+ </p>
11
+ <p>
12
+ <%= f.label :action %><br />
13
+ <%= f.text_field :action %>
14
+ </p>
15
+ <p>
16
+ <%= f.label :extra %><br />
17
+ <%= f.text_area :extra %>
18
+ </p>
19
+ <p><%= f.submit "Submit" %></p>
20
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <% @show_title = true; @content_for_title = "Edit Audit" %>
2
+
3
+ <%= render :partial => 'form' %>
4
+
5
+ <p>
6
+ <%= link_to "Show", @audit %> |
7
+ <%= link_to "View All", audits_path %>
8
+ </p>
@@ -0,0 +1,44 @@
1
+ <% @show_title = true; @content_for_title = "Audits" %>
2
+
3
+ Resources to filter on: <br />
4
+ <% for res in @resources_to_filter_on %>
5
+ <%= link_to res, audits_path(:user_id => params[:user_id], :resource => res) %>
6
+ <% end %>
7
+ <br />
8
+ <br />
9
+ <% if @mssg %>
10
+ <%= @mssg %> <span style="font-size:smaller">(<%= link_to "remove filter", audits_path %>)</span><br /><br />
11
+ <% end %>
12
+
13
+ <% sort_icon = params[:sort_order] == "desc" ? " &darr;" : " &uarr;" %>
14
+ <table id="audits">
15
+ <tr>
16
+ <th><%= link_to "Created#{sort_icon if params[:order_by] == "created_at"}", audits_path(:user_id => params[:user_id], :resource => params[:resource], :order_by => "created_at", :sort_order => ((params[:sort_order] == "asc" && params[:order_by] == "created_at") ? "desc" : "asc") ) %></th>
17
+ <th><%= link_to "User#{sort_icon if params[:order_by] == "user_id"}", audits_path(:user_id => params[:user_id], :resource => params[:resource], :order_by => "user_id", :sort_order => ((params[:sort_order] == "asc" && params[:order_by] == "user_id") ? "desc" : "asc") ) %></th>
18
+ <th><%= link_to "Resource#{sort_icon if params[:order_by] == "resource"}", audits_path(:user_id => params[:user_id], :resource => params[:resource], :order_by => "resource", :sort_order => ((params[:sort_order] == "asc" && params[:order_by] == "resource") ? "desc" : "asc") ) %></th>
19
+ <th>Action</th>
20
+ <th>Extra</th>
21
+ <th>&nbsp;</th>
22
+ </tr>
23
+ <% for audit in @audits %>
24
+ <tr id="<%= audit.id %>">
25
+ <td><%= audit.created_at.strftime("%m/%d/%Y %H:%M:%S") %></td>
26
+ <td><%= link_to audit.user.login, audits_path(:user_id => audit.user_id, :resource => params[:resource]) %></td>
27
+ <td><%= link_to audit.resource, audits_path(:user_id => params[:user_id], :resource => audit.resource) %></td>
28
+ <td><%= audit.action %></td>
29
+ <td><%= audit.extra %></td>
30
+ <td class="actions"><span><%= link_to "[destroy]", audit, :confirm => 'Are you sure?', :method => :delete, :style=>"font-size:smaller" %> <%= link_to "[show]", audit, :style=>"font-size:smaller" %></span></td>
31
+ </tr>
32
+ <% end %>
33
+ </table>
34
+ <br />
35
+ <%= will_paginate @audits %><br />
36
+ <span style='font-size:smaller'><%= page_entries_info @audits, :entry_name => 'item' %></span>
37
+
38
+ <script type="text/javascript" charset="utf-8">
39
+ $("#audits tr").mouseover(function(){
40
+ $("#"+this.id+" td.actions span").css('visibility','visible');
41
+ }).mouseout(function(){
42
+ $("#"+this.id+" td.actions span").css('visibility','hidden');
43
+ });
44
+ </script>
@@ -0,0 +1,5 @@
1
+ <% @show_title = true; @content_for_title = "New Audit" %>
2
+
3
+ <%= render :partial => 'form' %>
4
+
5
+ <p><%= link_to "Back to List", audits_path %></p>
@@ -0,0 +1,27 @@
1
+ <% @show_title = true; @content_for_title = "Audit" %>
2
+
3
+ <p>
4
+ <strong>User:</strong>
5
+ <%= User.find(@audit.user_id).login %>
6
+ </p>
7
+ <p>
8
+ <strong>Resource:</strong>
9
+ <%= @audit.resource %>
10
+ </p>
11
+ <p>
12
+ <strong>Action:</strong>
13
+ <%= @audit.action %>
14
+ </p>
15
+ <p>
16
+ <strong>Extra:</strong>
17
+ <%= @audit.extra %>
18
+ </p>
19
+
20
+ <p>
21
+ <% if request.env["HTTP_REFERER"] %>
22
+ <%= link_to "<< Back", request.env["HTTP_REFERER"] %> |
23
+ <% end %>
24
+ <%= link_to "Destroy", @audit, :confirm => 'Are you sure?', :method => :delete %> |
25
+ <%= link_to "View All", audits_path %>
26
+ </p>
27
+
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Explaining the generator.
3
+
4
+ Example:
5
+ ./script/generate simple_audit install
6
+
7
+ This will create:
8
+ Files, routes and migrations required by SimpleAudit plugin to work.
@@ -0,0 +1,25 @@
1
+ class SimpleAuditGenerator < Rails::Generator::NamedBase
2
+ def manifest
3
+ record do |m|
4
+
5
+ m.migration_template 'migration.rb', 'db/migrate', :assigns => {
6
+ :migration_name => "CreateAudits"
7
+ }, :migration_file_name => "create_audits"
8
+
9
+ sentinel = 'ActionController::Routing::Routes.draw do |map|'
10
+ logger.route "map.resources :audits"
11
+
12
+ gsub_file 'config/routes.rb', /(#{Regexp.escape(sentinel)})/mi do |match|
13
+ "#{match}\n map.resources :audits\n map.resources :users, :has_many => 'audits'\n"
14
+ end
15
+
16
+ end
17
+ end
18
+
19
+ def gsub_file(relative_destination, regexp, *args, &block)
20
+ path = destination_path(relative_destination)
21
+ content = File.read(path).gsub(regexp, *args, &block)
22
+ File.open(path, 'wb') { |file| file.write(content) }
23
+ end
24
+
25
+ end
@@ -0,0 +1,16 @@
1
+ class CreateAudits < ActiveRecord::Migration
2
+ def self.up
3
+ create_table "audits", :force => true do |t|
4
+ t.integer "user_id", :default => 0
5
+ t.string "resource"
6
+ t.string "action"
7
+ t.text "extra"
8
+ t.datetime "created_at"
9
+ t.datetime "updated_at"
10
+ end
11
+ end
12
+
13
+ def self.down
14
+ drop_table "audits"
15
+ end
16
+ end
data/init.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'simple_audit'
2
+
3
+ class ActionController::Base
4
+ include SimpleAudit
5
+ extend SimpleAudit
6
+ end
7
+
8
+ ActionController::Base.send(:include, SimpleAudit::ControllerMethods::Application)
@@ -0,0 +1,4 @@
1
+ # Install hook code here
2
+ Dir.glob(File.join(File.dirname(__FILE__), "db", "migrate", "*")).each do |file|
3
+ require file
4
+ end
@@ -0,0 +1,16 @@
1
+ class CreateAudits < ActiveRecord::Migration
2
+ def self.up
3
+ create_table "audits", :force => true do |t|
4
+ t.integer "user_id", :default => 0
5
+ t.string "resource"
6
+ t.string "action"
7
+ t.text "extra"
8
+ t.datetime "created_at"
9
+ t.datetime "updated_at"
10
+ end
11
+ end
12
+
13
+ def self.down
14
+ drop_table "audits"
15
+ end
16
+ end
@@ -0,0 +1,67 @@
1
+ module SimpleAudit
2
+
3
+ # Сделать запись в аудит-лог из контроллера
4
+ # записи автоматически присваевается user_id и прочие параметры
5
+ # для дополнительной информации есть поле 'extra'
6
+ def audit(extra='')
7
+ return false unless current_user
8
+ Audit.create(:user_id => current_user.id, :resource => params[:controller], :action => params[:action], :extra => extra)
9
+ # logger.warn "Eeeei, it works!"
10
+ end
11
+
12
+ module ControllerMethods
13
+ module Application
14
+ def self.included(controller)
15
+ controller.extend ClassMethods
16
+ controller.class_inheritable_accessor :auditables
17
+ controller.auditables = []
18
+ controller.before_filter :audit_actions
19
+ end
20
+
21
+ private
22
+
23
+ # подсмотрено у simple_authorization, кажется
24
+ def audit_actions
25
+ return if !current_user
26
+
27
+ self.class.auditables.each do |actions|
28
+ options = actions.last.is_a?(Hash) ? actions.last : {}
29
+
30
+ next if options[:if] && !options[:if].call(self)
31
+ next if options[:unless] && options[:unless].call(self)
32
+ next if options[:only] && !auditable_actions(options[:only]).include?(action_name)
33
+ next if options[:except] && auditable_actions(options[:except]).include?(action_name)
34
+
35
+ audit()
36
+ end
37
+ end
38
+
39
+ def auditable_actions(actions)
40
+ actions = [actions] unless actions.is_a?(Array)
41
+ actions.map(&:to_s)
42
+ end
43
+
44
+
45
+ module ClassMethods
46
+
47
+ # before_filter для контроллеров
48
+ def audit_this(*actions)
49
+ auditables << actions
50
+ end
51
+ end
52
+
53
+ end
54
+ end
55
+ end
56
+
57
+ %w{ models controllers helpers views views/audits }.each do |dir|
58
+ path = File.join(File.dirname(__FILE__), 'app', dir)
59
+ $LOAD_PATH << path
60
+ ActiveSupport::Dependencies.load_paths << path
61
+ ActiveSupport::Dependencies.load_once_paths.delete(path)
62
+ end
63
+
64
+ # optionally:
65
+ # Dir.glob(File.join(File.dirname(__FILE__), "db", "migrate", "*")).each do |file|
66
+ # require file
67
+ # end
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{simple_audit}
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 = ["Alfuken"]
9
+ s.date = %q{2009-09-11}
10
+ s.description = %q{Simple auditing plugin.}
11
+ s.email = %q{alfuken@gmail.com}
12
+ s.extra_rdoc_files = ["README", "lib/db/migrate/20090908101900_create_audits.rb", "lib/simple_audit.rb", "tasks/simple_audit_tasks.rake"]
13
+ s.files = ["MIT-LICENSE", "README", "Rakefile", "app/controllers/audits_controller.rb", "app/helpers/layout_helper.rb", "app/models/audit.rb", "app/views/audits/_form.html.erb", "app/views/audits/edit.html.erb", "app/views/audits/index.html.erb", "app/views/audits/new.html.erb", "app/views/audits/show.html.erb", "generators/simple_audit/USAGE", "generators/simple_audit/simple_audit_generator.rb", "generators/simple_audit/templates/migration.rb", "init.rb", "install.rb", "lib/db/migrate/20090908101900_create_audits.rb", "lib/simple_audit.rb", "tasks/simple_audit_tasks.rake", "test/simple_audit_test.rb", "test/test_helper.rb", "uninstall.rb", "Manifest", "simple_audit.gemspec"]
14
+ s.homepage = %q{http://github.com/alfuken/}
15
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Simple_audit", "--main", "README"]
16
+ s.require_paths = ["lib"]
17
+ s.rubyforge_project = %q{simple_audit}
18
+ s.rubygems_version = %q{1.3.3}
19
+ s.summary = %q{Simple auditing plugin.}
20
+ s.test_files = ["test/simple_audit_test.rb", "test/test_helper.rb"]
21
+
22
+ if s.respond_to? :specification_version then
23
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
24
+ s.specification_version = 3
25
+
26
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
27
+ else
28
+ end
29
+ else
30
+ end
31
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :simple_audit do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,8 @@
1
+ require 'test_helper'
2
+
3
+ class SimpleAuditTest < ActiveSupport::TestCase
4
+ # Replace this with your real tests.
5
+ test "the truth" do
6
+ assert true
7
+ end
8
+ end
@@ -0,0 +1,3 @@
1
+ require 'rubygems'
2
+ require 'active_support'
3
+ require 'active_support/test_case'
@@ -0,0 +1 @@
1
+ # Uninstall hook code here
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: alfuken-simple_audit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Alfuken
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-09-11 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Simple auditing plugin.
17
+ email: alfuken@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README
24
+ - lib/db/migrate/20090908101900_create_audits.rb
25
+ - lib/simple_audit.rb
26
+ - tasks/simple_audit_tasks.rake
27
+ files:
28
+ - MIT-LICENSE
29
+ - README
30
+ - Rakefile
31
+ - app/controllers/audits_controller.rb
32
+ - app/helpers/layout_helper.rb
33
+ - app/models/audit.rb
34
+ - app/views/audits/_form.html.erb
35
+ - app/views/audits/edit.html.erb
36
+ - app/views/audits/index.html.erb
37
+ - app/views/audits/new.html.erb
38
+ - app/views/audits/show.html.erb
39
+ - generators/simple_audit/USAGE
40
+ - generators/simple_audit/simple_audit_generator.rb
41
+ - generators/simple_audit/templates/migration.rb
42
+ - init.rb
43
+ - install.rb
44
+ - lib/db/migrate/20090908101900_create_audits.rb
45
+ - lib/simple_audit.rb
46
+ - tasks/simple_audit_tasks.rake
47
+ - test/simple_audit_test.rb
48
+ - test/test_helper.rb
49
+ - uninstall.rb
50
+ - Manifest
51
+ - simple_audit.gemspec
52
+ has_rdoc: false
53
+ homepage: http://github.com/alfuken/
54
+ post_install_message:
55
+ rdoc_options:
56
+ - --line-numbers
57
+ - --inline-source
58
+ - --title
59
+ - Simple_audit
60
+ - --main
61
+ - README
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ version:
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: "1.2"
75
+ version:
76
+ requirements: []
77
+
78
+ rubyforge_project: simple_audit
79
+ rubygems_version: 1.2.0
80
+ signing_key:
81
+ specification_version: 3
82
+ summary: Simple auditing plugin.
83
+ test_files:
84
+ - test/simple_audit_test.rb
85
+ - test/test_helper.rb