models_timeline 0.0.1.2 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +6 -2
- data/app/controllers/models_timeline/application_controller.rb +4 -0
- data/app/controllers/models_timeline/tracks_controller.rb +23 -0
- data/app/helpers/timeline/application_helper.rb +1 -1
- data/app/helpers/timeline/tracks_helper.rb +1 -1
- data/app/models/models_timeline/track.rb +7 -0
- data/app/views/{timeline → models_timeline}/tracks/_track.erb +0 -0
- data/app/views/{timeline → models_timeline}/tracks/index.html.erb +0 -0
- data/app/views/{timeline → models_timeline}/tracks/show.html.erb +0 -0
- data/config/routes.rb +1 -1
- data/db/migrate/20121227092029_create_models_timeline_tracks.rb +14 -0
- data/lib/models_timeline/engine.rb +9 -0
- data/lib/models_timeline/model_additions.rb +60 -0
- data/lib/models_timeline/railtie.rb +9 -0
- data/lib/models_timeline/version.rb +3 -0
- data/lib/models_timeline.rb +3 -0
- data/lib/tasks/timeline_tasks.rake +3 -3
- data/lib/timeline/version.rb +2 -2
- data/lib/timeline.rb +1 -1
- data/test/dummy/log/development.log +0 -0
- data/test/functional/timeline/tracks_controller_test.rb +1 -1
- data/test/model/helpers/timeline/timelines_helper_test.rb +1 -1
- data/test/model/helpers/tracks_helper_test.rb +1 -1
- data/test/model/modesl_timeline/track_test.rb +92 -0
- data/test/model/timeline/track_test.rb +1 -1
- metadata +17 -4
data/README.rdoc
CHANGED
@@ -4,7 +4,7 @@ Track the entire life cycle of ActiveRecord models.
|
|
4
4
|
==Installation
|
5
5
|
Add the gem to your Gemfile
|
6
6
|
|
7
|
-
gem "
|
7
|
+
gem "models_timeline"
|
8
8
|
|
9
9
|
Copy some migration stuff:
|
10
10
|
|
@@ -13,7 +13,7 @@ Copy some migration stuff:
|
|
13
13
|
|
14
14
|
Add to your route.rb file:
|
15
15
|
|
16
|
-
mount
|
16
|
+
mount ModelsTimeline::Engine => "/timeline"
|
17
17
|
|
18
18
|
Requires Ruby 1.9.2 or later.
|
19
19
|
|
@@ -37,6 +37,10 @@ Track one or more attributes:
|
|
37
37
|
|
38
38
|
Only the changes of name and price will be tracked.
|
39
39
|
|
40
|
+
To see the tracked changes go to:
|
41
|
+
|
42
|
+
http://domain:port/models_timeline
|
43
|
+
|
40
44
|
Development
|
41
45
|
Questions or problems? Please post them on the issue tracker. You can contribute changes by forking the project and submitting a pull request. You can ensure the tests passing by running bundle and rake.
|
42
46
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require_dependency "models_timeline/application_controller"
|
2
|
+
|
3
|
+
module ModelsTimeline
|
4
|
+
class TracksController < ApplicationController
|
5
|
+
def index
|
6
|
+
@tracks = Track.all
|
7
|
+
|
8
|
+
respond_to do |format|
|
9
|
+
format.html # index.html.erb
|
10
|
+
format.json { render json: @tracks }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def show
|
15
|
+
@track = Track.find(params[:id])
|
16
|
+
|
17
|
+
respond_to do |format|
|
18
|
+
format.html # show.html.erb
|
19
|
+
format.json { render json: @track }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
data/config/routes.rb
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
class CreateModelsTimelineTracks < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :models_timeline_tracks do |t|
|
4
|
+
t.integer :item_id
|
5
|
+
t.string :model_name
|
6
|
+
t.string :action
|
7
|
+
t.string :model_changes
|
8
|
+
|
9
|
+
t.timestamps
|
10
|
+
end
|
11
|
+
add_index(:models_timeline_tracks, :item_id)
|
12
|
+
add_index(:models_timeline_tracks, :model_name)
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module ModelsTimeline
|
2
|
+
module ModelAdditions
|
3
|
+
def self.extended(obj) #:nodoc
|
4
|
+
obj.send :include, ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
# To track your model changes call <tt> timeline </tt>
|
8
|
+
# in any Active Record model class.
|
9
|
+
#
|
10
|
+
# class Product < ActiveRecord::Base
|
11
|
+
# timeline
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# To track only one or a set of attributes(columns) call <tt> timeline :attr1, :attr2 </tt>.
|
15
|
+
#
|
16
|
+
# class Product < ActiveRecord::Base
|
17
|
+
# timeline :price, :description
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
def timeline(*attrs)
|
21
|
+
track(attrs)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
def track(attributes)
|
26
|
+
after_create do |record|
|
27
|
+
map_attributes_and_save('created', attributes)
|
28
|
+
end
|
29
|
+
|
30
|
+
after_update do |record|
|
31
|
+
map_attributes_and_save('updated', attributes)
|
32
|
+
end
|
33
|
+
|
34
|
+
after_destroy do |record|
|
35
|
+
map_attributes_and_save('destroyed', attributes)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
module ClassMethods
|
41
|
+
def map_attributes_and_save(action, attributes={})
|
42
|
+
attributes = attributes.map{|a| a.to_s unless a.is_a? String}
|
43
|
+
|
44
|
+
model_changes = unless attributes.empty?
|
45
|
+
HashWithIndifferentAccess.new self.changes.select{|c| attributes.include?(c)}
|
46
|
+
else
|
47
|
+
self.changes
|
48
|
+
end
|
49
|
+
|
50
|
+
model_changes.delete(:created_at)
|
51
|
+
model_changes.delete(:updated_at)
|
52
|
+
|
53
|
+
Track.create!({
|
54
|
+
item_id: self.id,
|
55
|
+
model_name: self.class.model_name,
|
56
|
+
action: action,
|
57
|
+
model_changes: model_changes })
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
1
|
# desc "Explaining what the task does"
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
task :timeline do
|
3
|
+
# Task goes here
|
4
|
+
end
|
data/lib/timeline/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
module
|
2
|
-
VERSION = "0.0.
|
1
|
+
module ModelsTimeline
|
2
|
+
VERSION = "0.0.2"
|
3
3
|
end
|
data/lib/timeline.rb
CHANGED
File without changes
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'debugger'
|
3
|
+
module ModelsTimeline
|
4
|
+
class TrackTest < ActiveSupport::TestCase
|
5
|
+
self.use_transactional_fixtures = true
|
6
|
+
|
7
|
+
setup do
|
8
|
+
Track.destroy_all
|
9
|
+
end
|
10
|
+
|
11
|
+
def attr
|
12
|
+
{name: 'angelo', days: 2, done: true}
|
13
|
+
end
|
14
|
+
|
15
|
+
def new_project
|
16
|
+
Project.create!(attr)
|
17
|
+
end
|
18
|
+
|
19
|
+
test "test model addition" do
|
20
|
+
assert_kind_of Class, Project
|
21
|
+
assert_respond_to Project, :timeline
|
22
|
+
assert_respond_to Project, :timeline, {}
|
23
|
+
end
|
24
|
+
|
25
|
+
test "track all model attributes" do
|
26
|
+
Project.timeline
|
27
|
+
project = new_project
|
28
|
+
|
29
|
+
track = Track.first
|
30
|
+
assert_equal Track.all.count, 1
|
31
|
+
assert_equal track.model_name, 'Project'
|
32
|
+
#test if all attributes are correctly stored
|
33
|
+
attr.each_key do |k|
|
34
|
+
assert_equal track.model_changes[k], [nil, attr[k]]
|
35
|
+
end
|
36
|
+
|
37
|
+
#update
|
38
|
+
project.update_attributes({name: 'pippo'})
|
39
|
+
track = Track.first
|
40
|
+
assert_equal Track.all.count, 2
|
41
|
+
assert_equal track.model_name, 'Project'
|
42
|
+
assert_equal track.action, 'updated'
|
43
|
+
#test track added on update
|
44
|
+
assert_equal track.model_changes.size, 1
|
45
|
+
debugger
|
46
|
+
assert_equal track.model_changes[:name], ['angelo','pippo']
|
47
|
+
|
48
|
+
#destroy
|
49
|
+
project.destroy
|
50
|
+
track = Track.first
|
51
|
+
assert_equal Track.all.count, 3
|
52
|
+
assert_equal track.model_name, 'Project'
|
53
|
+
assert_equal track.action, 'destroyed'
|
54
|
+
#test track added on update
|
55
|
+
assert_equal track.model_changes.size, 0
|
56
|
+
end
|
57
|
+
|
58
|
+
test "track all some attributes" do
|
59
|
+
Project.reset_callbacks :create
|
60
|
+
Project.reset_callbacks :update
|
61
|
+
|
62
|
+
Project.timeline(:name,:days)
|
63
|
+
|
64
|
+
project = Project.create!({name: 'angelo', days: 2, done: true})
|
65
|
+
assert_equal Project.all.count, 1
|
66
|
+
track = Track.first
|
67
|
+
assert_equal track.model_name, 'Project'
|
68
|
+
#test if all attributes are correctly stored
|
69
|
+
[:name, :days].each do |k|
|
70
|
+
assert_equal track.model_changes[k], [nil, attr[k]]
|
71
|
+
end
|
72
|
+
|
73
|
+
#update
|
74
|
+
project.update_attributes({name: 'tom', days: 4})
|
75
|
+
track = Track.first
|
76
|
+
assert_equal track.model_name, 'Project'
|
77
|
+
assert_equal track.action, 'updated'
|
78
|
+
#test track added on update
|
79
|
+
assert_equal track.model_changes.size, 2
|
80
|
+
assert_equal track.model_changes[:name], ['angelo','tom']
|
81
|
+
assert_equal track.model_changes[:days], [2,4]
|
82
|
+
|
83
|
+
#destroy
|
84
|
+
project.destroy
|
85
|
+
track = Track.first
|
86
|
+
assert_equal track.model_name, 'Project'
|
87
|
+
assert_equal track.action, 'destroyed'
|
88
|
+
#test track added on update
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: models_timeline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -71,17 +71,26 @@ files:
|
|
71
71
|
- app/assets/stylesheets/scaffold.css
|
72
72
|
- app/assets/stylesheets/timeline/application.css
|
73
73
|
- app/assets/stylesheets/timeline/tracks.css
|
74
|
+
- app/controllers/models_timeline/application_controller.rb
|
75
|
+
- app/controllers/models_timeline/tracks_controller.rb
|
74
76
|
- app/controllers/timeline/application_controller.rb
|
75
77
|
- app/controllers/timeline/tracks_controller.rb
|
76
78
|
- app/helpers/timeline/application_helper.rb
|
77
79
|
- app/helpers/timeline/tracks_helper.rb
|
80
|
+
- app/models/models_timeline/track.rb
|
78
81
|
- app/models/timeline/track.rb
|
79
82
|
- app/views/layouts/timeline/application.html.erb
|
80
|
-
- app/views/
|
81
|
-
- app/views/
|
82
|
-
- app/views/
|
83
|
+
- app/views/models_timeline/tracks/_track.erb
|
84
|
+
- app/views/models_timeline/tracks/index.html.erb
|
85
|
+
- app/views/models_timeline/tracks/show.html.erb
|
83
86
|
- config/routes.rb
|
87
|
+
- db/migrate/20121227092029_create_models_timeline_tracks.rb
|
84
88
|
- db/migrate/20121227092029_create_timeline_tracks.rb
|
89
|
+
- lib/models_timeline/engine.rb
|
90
|
+
- lib/models_timeline/model_additions.rb
|
91
|
+
- lib/models_timeline/railtie.rb
|
92
|
+
- lib/models_timeline/version.rb
|
93
|
+
- lib/models_timeline.rb
|
85
94
|
- lib/tasks/timeline_tasks.rake
|
86
95
|
- lib/timeline/engine.rb
|
87
96
|
- lib/timeline/model_additions.rb
|
@@ -115,6 +124,7 @@ files:
|
|
115
124
|
- test/dummy/config.ru
|
116
125
|
- test/dummy/db/migrate/20121227094706_create_projects.rb
|
117
126
|
- test/dummy/db/schema.rb
|
127
|
+
- test/dummy/log/development.log
|
118
128
|
- test/dummy/public/404.html
|
119
129
|
- test/dummy/public/422.html
|
120
130
|
- test/dummy/public/500.html
|
@@ -129,6 +139,7 @@ files:
|
|
129
139
|
- test/integration/navigation_test.rb
|
130
140
|
- test/model/helpers/timeline/timelines_helper_test.rb
|
131
141
|
- test/model/helpers/tracks_helper_test.rb
|
142
|
+
- test/model/modesl_timeline/track_test.rb
|
132
143
|
- test/model/timeline/track_test.rb
|
133
144
|
- test/test_helper.rb
|
134
145
|
- test/timeline_test.rb
|
@@ -181,6 +192,7 @@ test_files:
|
|
181
192
|
- test/dummy/config.ru
|
182
193
|
- test/dummy/db/migrate/20121227094706_create_projects.rb
|
183
194
|
- test/dummy/db/schema.rb
|
195
|
+
- test/dummy/log/development.log
|
184
196
|
- test/dummy/public/404.html
|
185
197
|
- test/dummy/public/422.html
|
186
198
|
- test/dummy/public/500.html
|
@@ -195,6 +207,7 @@ test_files:
|
|
195
207
|
- test/integration/navigation_test.rb
|
196
208
|
- test/model/helpers/timeline/timelines_helper_test.rb
|
197
209
|
- test/model/helpers/tracks_helper_test.rb
|
210
|
+
- test/model/modesl_timeline/track_test.rb
|
198
211
|
- test/model/timeline/track_test.rb
|
199
212
|
- test/test_helper.rb
|
200
213
|
- test/timeline_test.rb
|