impressionist 1.3.2 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.rdoc +15 -0
- data/README.md +32 -6
- data/app/models/impressionist/impressionable.rb +17 -33
- data/lib/impressionist.rb +1 -1
- data/lib/impressionist/counter_cache.rb +83 -0
- data/lib/impressionist/load.rb +7 -0
- data/lib/impressionist/models/active_record/impression.rb +9 -17
- data/lib/impressionist/models/active_record/impressionist/impressionable.rb +16 -2
- data/lib/impressionist/set_up_association.rb +14 -0
- data/lib/impressionist/update_counters.rb +63 -0
- data/lib/impressionist/version.rb +1 -1
- data/test_app/Gemfile +2 -2
- data/test_app/app/models/widget.rb +1 -1
- data/test_app/db/migrate/20111127184039_create_widgets.rb +1 -1
- data/test_app/spec/controllers/controller_spec.rb +1 -1
- data/test_app/spec/models/counter_caching_spec.rb +10 -9
- data/test_app/spec/models/model_spec.rb +1 -33
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 565d11269849faecb7c83d6cda308c6c1e9eba4c
|
4
|
+
data.tar.gz: ed373d6474fee728c3742b0d475ad5d425f9902e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a4160978bf2c001b1c8f2ea24f18bc563d3cd821de5294de0f5b2da8f1c87e8e3a7c2f0c210bd7420b8a7c216383f23ffb61875bac3930475dd163f90f6a5c6
|
7
|
+
data.tar.gz: bc2f41f6556664349216614eec6fdc9d366f40ac0e5fbd5bcbc1eab2fd470897104581f2b19ae31267067273a49a59693edff525a6c6c34596a8c00573932f65
|
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
== 1.4.0 (2013-07-06)
|
2
|
+
* Fixed #92
|
3
|
+
* Pass option to unique for updatind counter_cache
|
4
|
+
* Clean up code, make it human readable
|
5
|
+
* Changed README in order to explain new features
|
6
|
+
* (@nbit001)
|
7
|
+
|
8
|
+
== 1.3.3 (2013-06-27)
|
9
|
+
* Added Rails4 Branch in order to support rails 4
|
10
|
+
* Rails 4 and Strong Parameters compability. (@bennick).
|
11
|
+
|
12
|
+
== 1.3.1 (non specified)
|
13
|
+
* Change controller_path back to controller_name (@johnmcaliley)
|
14
|
+
|
15
|
+
|
1
16
|
== 0.4.0 (2011-06-03)
|
2
17
|
* Fix postgres bug
|
3
18
|
* New impression count method that accepts options for filter, start_date and end_date
|
data/README.md
CHANGED
@@ -136,14 +136,29 @@ most basic configuration looks like:
|
|
136
136
|
is_impressionable :counter_cache => true
|
137
137
|
|
138
138
|
This will automatically increment the `impressions_count` column in the
|
139
|
-
included model. Note: You'll need to add that column to your model. If you'd
|
140
|
-
like specific a different column name, you can
|
139
|
+
included model. <b>Note: You'll need to add that column to your model. If you'd
|
140
|
+
like specific a different column name, you can:</b>
|
141
141
|
|
142
|
-
is_impressionable :counter_cache => { :column_name => :
|
142
|
+
is_impressionable :counter_cache => { :column_name => :my_column_name }
|
143
143
|
|
144
144
|
If you'd like to include only unique impressions in your count:
|
145
145
|
|
146
|
-
|
146
|
+
# default will be filtered by ip_address
|
147
|
+
is_impressionable :counter_cache => { :column_name => :my_column_name, :unique => true }
|
148
|
+
|
149
|
+
If you'd like to specify what sort of unique impression you'd like to save? Fear not,
|
150
|
+
Any option you pass to unique, impressionist_count will use it as its filter to update_counters based on that unique option.
|
151
|
+
|
152
|
+
# options are any column in the impressions' table.
|
153
|
+
is_impressionable :counter_cache => { :column_name => :my_column_name, :unique => :request_hash }
|
154
|
+
is_impressionable :counter_cache => { :column_name => :my_column_name, :unique => :all }
|
155
|
+
|
156
|
+
|
157
|
+
Adding column to model
|
158
|
+
----------------------
|
159
|
+
It is as simple as this:
|
160
|
+
|
161
|
+
t.integer :my_column_name, :default => 0
|
147
162
|
|
148
163
|
What if I only want to record unique impressions?
|
149
164
|
-------------------------------------------------
|
@@ -170,7 +185,7 @@ Are you using Mongoid?
|
|
170
185
|
Execute this command on your terminal/console:
|
171
186
|
|
172
187
|
rails g impressionist --orm mongoid
|
173
|
-
|
188
|
+
|
174
189
|
This command create a file `impression.rb` on `config/initializer` folder. Add `config.orm = :mongoid` to this file:
|
175
190
|
|
176
191
|
# Use this hook to configure impressionist parameters
|
@@ -179,7 +194,7 @@ This command create a file `impression.rb` on `config/initializer` folder. Add `
|
|
179
194
|
# config.orm = :active_record
|
180
195
|
config.orm = :mongoid
|
181
196
|
end
|
182
|
-
|
197
|
+
|
183
198
|
|
184
199
|
Contributing to impressionist
|
185
200
|
-----------------------------
|
@@ -197,10 +212,21 @@ Contributing to impressionist
|
|
197
212
|
* All testing is done inside a small Rails app (test_app). You will find specs
|
198
213
|
within this app.
|
199
214
|
|
215
|
+
|
216
|
+
Want to run the tests? Ok mummy
|
217
|
+
-------------------------------
|
218
|
+
* bundle install
|
219
|
+
* rails g impressionist
|
220
|
+
* rake db:migrate && rake db:test:prepare
|
221
|
+
* Run rake or rspec spec inside test_app dir
|
222
|
+
* nothing else.
|
223
|
+
* :wq
|
224
|
+
|
200
225
|
Contributors
|
201
226
|
------------
|
202
227
|
* [johnmcaliley](https://github.com/johnmcaliley)
|
203
228
|
* [coryschires](https://github.com/coryschires)
|
204
229
|
* [georgmittendorfer](https://github.com/georgmittendorfer)
|
230
|
+
* [Antonio C Nalesso](https://github.com/nbit001)
|
205
231
|
|
206
232
|
Copyright (c) 2011 John McAliley. See LICENSE.txt for further details.
|
@@ -4,59 +4,43 @@ module Impressionist
|
|
4
4
|
|
5
5
|
module ClassMethods
|
6
6
|
attr_accessor :impressionist_cache_options
|
7
|
-
|
7
|
+
|
8
|
+
DEFAULT_CACHE = { :counter_cache => false, :column_name => :impressions_count, :unique => false }
|
8
9
|
|
9
10
|
def impressionist_counter_cache_options
|
10
|
-
|
11
|
-
|
12
|
-
options.merge!(@impressionist_cache_options) if @impressionist_cache_options.is_a?(Hash)
|
13
|
-
options
|
14
|
-
end
|
11
|
+
@impressionist_cache_options ||= {}
|
12
|
+
@impressionist_cache_options.reverse_merge!(DEFAULT_CACHE)
|
15
13
|
end
|
16
14
|
|
15
|
+
# true or false
|
17
16
|
def impressionist_counter_caching?
|
18
|
-
impressionist_counter_cache_options
|
17
|
+
impressionist_counter_cache_options[:counter_cache]
|
19
18
|
end
|
20
19
|
|
21
20
|
def counter_caching?
|
22
|
-
|
23
|
-
|
21
|
+
::ActiveSupport::Deprecation.warn("#counter_caching? is deprecated; please use #impressionist_counter_caching? instead")
|
22
|
+
impressionist_counter_caching?
|
24
23
|
end
|
25
|
-
end
|
26
24
|
|
27
|
-
def impressionable?
|
28
|
-
true
|
29
25
|
end
|
30
26
|
|
27
|
+
# ------------------------------------------
|
28
|
+
# TODO: CLEAN UP, make it HUMAN readable
|
31
29
|
def impressionist_count(options={})
|
32
30
|
options.reverse_merge!(:filter=>:request_hash, :start_date=>nil, :end_date=>Time.now)
|
33
31
|
imps = options[:start_date].blank? ? impressions : impressions.where("created_at>=? and created_at<=?",options[:start_date],options[:end_date])
|
34
32
|
options[:filter] == :all ? imps.count : imps.count(options[:filter], :distinct => true)
|
35
33
|
end
|
36
34
|
|
37
|
-
def update_impressionist_counter_cache
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
old_count = send(column_name) || 0
|
42
|
-
self.class.update_counters(id, column_name => (count - old_count))
|
43
|
-
end
|
44
|
-
|
45
|
-
# OLD METHODS - DEPRECATE IN V0.5
|
46
|
-
def impression_count(start_date=nil,end_date=Time.now)
|
47
|
-
impressionist_count({:start_date=>start_date, :end_date=>end_date, :filter=>:all})
|
48
|
-
end
|
35
|
+
def update_impressionist_counter_cache
|
36
|
+
slave = Impressionist::UpdateCounters.new(self)
|
37
|
+
slave.update
|
38
|
+
end
|
49
39
|
|
50
|
-
def
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
def unique_impression_count_ip(start_date=nil,end_date=Time.now)
|
55
|
-
impressionist_count({:start_date=>start_date, :end_date=>end_date, :filter=> :ip_address})
|
40
|
+
def impressionable?
|
41
|
+
true
|
56
42
|
end
|
57
43
|
|
58
|
-
def unique_impression_count_session(start_date=nil,end_date=Time.now)
|
59
|
-
impressionist_count({:start_date=>start_date, :end_date=>end_date, :filter=> :session_hash})
|
60
|
-
end
|
61
44
|
end
|
45
|
+
|
62
46
|
end
|
data/lib/impressionist.rb
CHANGED
@@ -0,0 +1,83 @@
|
|
1
|
+
module Impressionist
|
2
|
+
module CounterCache
|
3
|
+
|
4
|
+
attr_reader :impressionable_class, :entity
|
5
|
+
|
6
|
+
private
|
7
|
+
LOG_MESSAGE = "Can't find impressionable_type or impressionable_id. Will not update_counters!"
|
8
|
+
|
9
|
+
# if updatable returns true, it must be qualified to update_counters
|
10
|
+
# Therefore there's no need to validate again
|
11
|
+
# impressionable_class instance var is set when updatable? is called
|
12
|
+
def impressionable_counter_cache_updatable?
|
13
|
+
updatable? ? update_impression_cache : impressionist_log(LOG_MESSAGE)
|
14
|
+
end
|
15
|
+
|
16
|
+
def update_impression_cache
|
17
|
+
impressionable_find
|
18
|
+
impressionable_try
|
19
|
+
end
|
20
|
+
|
21
|
+
# asks imp_id whether it's present or not
|
22
|
+
# also expect imp_class to be true
|
23
|
+
# all should be true, so that it is updatable
|
24
|
+
def updatable?
|
25
|
+
@impressionable_class = impressionable_class_set
|
26
|
+
impressionable_valid?
|
27
|
+
end
|
28
|
+
|
29
|
+
# imps_type == nil, constantize returns Object
|
30
|
+
# Therefore it attemps to return false so it won't be updatable
|
31
|
+
# calls to_s otherwise it would try to constantize nil
|
32
|
+
# and it would raise an exeception..
|
33
|
+
def impressionable_class_set
|
34
|
+
_type_ = self.impressionable_type.to_s.constantize
|
35
|
+
((_type_.to_s !~ /Object/) && _type_.impressionist_counter_caching? ? _type_ : false)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Either true or false
|
39
|
+
# needs true to be updatable
|
40
|
+
def impressionable_valid?
|
41
|
+
(self.impressionable_id.present? && impressionable_class && impressionable_find)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Logs to log file, expects a message to be passed
|
45
|
+
# default mode is ERROR
|
46
|
+
def impressionist_log(mode=:error, str)
|
47
|
+
Rails.logger.send(mode.to_s, str)
|
48
|
+
end
|
49
|
+
|
50
|
+
# read it out and LOUD
|
51
|
+
def impressionable_find
|
52
|
+
exeception_rescuer {
|
53
|
+
@entity = impressionable_class.find(self.impressionable_id)
|
54
|
+
}
|
55
|
+
@entity
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
# receives an entity(instance of a Model) and then tries to update
|
60
|
+
# counter_cache column
|
61
|
+
# entity is a impressionable_model
|
62
|
+
def impressionable_try
|
63
|
+
entity.try(:update_impressionist_counter_cache)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Returns false, as it is only handling one exeception
|
67
|
+
# It would make updatable to fail thereafter it would not try
|
68
|
+
# to update cache_counter
|
69
|
+
def exeception_rescuer
|
70
|
+
begin
|
71
|
+
yield
|
72
|
+
rescue ActiveRecord::RecordNotFound
|
73
|
+
exeception_to_log
|
74
|
+
false
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def exeception_to_log
|
79
|
+
impressionist_log("Couldn't find Widget with id=#{self.impressionable_id}")
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
@@ -1,21 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
belongs_to :impressionable, :polymorphic=>true
|
1
|
+
# Responsability
|
2
|
+
# * be able to update_counters
|
3
|
+
# * log an error if imps_id and imps_type can not be found
|
4
|
+
# asks updatable? whether it may or may not be updated
|
5
|
+
# FIX exeception raising when no imps_id is found
|
7
6
|
|
8
|
-
|
7
|
+
class Impression < ActiveRecord::Base
|
8
|
+
include Impressionist::CounterCache
|
9
|
+
include Impressionist::SetUpAssociation
|
9
10
|
|
10
|
-
|
11
|
+
after_save :impressionable_counter_cache_updatable?
|
11
12
|
|
12
|
-
def update_impressions_counter_cache
|
13
|
-
if self.impressionable_type && self.impressionable_id
|
14
|
-
impressionable_class = self.impressionable_type.constantize
|
15
|
-
if impressionable_class.impressionist_counter_cache_options
|
16
|
-
resouce = impressionable_class.find(self.impressionable_id)
|
17
|
-
resouce.try(:update_impressionist_counter_cache)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
13
|
end
|
@@ -2,13 +2,27 @@ ActiveRecord::Base.send(:include, Impressionist::Impressionable)
|
|
2
2
|
|
3
3
|
module Impressionist
|
4
4
|
module Impressionable
|
5
|
+
|
5
6
|
extend ActiveSupport::Concern
|
6
7
|
|
7
8
|
module ClassMethods
|
8
9
|
def is_impressionable(options={})
|
9
|
-
|
10
|
-
|
10
|
+
define_association
|
11
|
+
imp_cache_options_set(options)
|
12
|
+
end
|
13
|
+
|
14
|
+
def define_association
|
15
|
+
has_many(:impressions,
|
16
|
+
:as => :impressionable,
|
17
|
+
:dependent => :destroy)
|
18
|
+
end
|
19
|
+
|
20
|
+
def imp_cache_options_set(options)
|
21
|
+
@impressionist_cache_options = options
|
11
22
|
end
|
23
|
+
|
12
24
|
end
|
25
|
+
|
13
26
|
end
|
27
|
+
|
14
28
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Impressionist
|
2
|
+
module SetUpAssociation
|
3
|
+
|
4
|
+
def self.included(base)
|
5
|
+
base.attr_accessible(:impressionable_type,:impressionable_id,
|
6
|
+
:user_id,:controller_name,:action_name,:view_name,:request_hash,
|
7
|
+
:ip_address,:session_hash,:message,:referrer)
|
8
|
+
|
9
|
+
base.belongs_to(:impressionable, :polymorphic => true)
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Impressionist
|
2
|
+
class UpdateCounters
|
3
|
+
attr_reader :receiver, :master
|
4
|
+
|
5
|
+
def initialize(receiver)
|
6
|
+
@receiver = receiver
|
7
|
+
@master = receiver.class
|
8
|
+
end
|
9
|
+
|
10
|
+
def update
|
11
|
+
result = (impressions_total - impressions_cached)
|
12
|
+
|
13
|
+
master.
|
14
|
+
update_counters(id, column_name => result)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
def id
|
19
|
+
receiver.id
|
20
|
+
end
|
21
|
+
|
22
|
+
# if unique == true then uses it
|
23
|
+
# otherwise just count all impressions
|
24
|
+
# using filter: :all
|
25
|
+
def impressions_total
|
26
|
+
receiver.impressionist_count filter(unique_filter)
|
27
|
+
end
|
28
|
+
|
29
|
+
# from a given db column
|
30
|
+
# default should be impressions_count
|
31
|
+
def impressions_cached
|
32
|
+
receiver.send(column_name) || 0
|
33
|
+
end
|
34
|
+
|
35
|
+
def column_name
|
36
|
+
cache_options[:column_name].to_sym
|
37
|
+
end
|
38
|
+
|
39
|
+
def cache_options
|
40
|
+
master.
|
41
|
+
impressionist_counter_cache_options
|
42
|
+
end
|
43
|
+
|
44
|
+
# default is ip_address if what_is_unique is TRUE or FALSE
|
45
|
+
def unique_filter
|
46
|
+
what_is_unique? ? :ip_address : cache_options[:unique]
|
47
|
+
end
|
48
|
+
|
49
|
+
# Either true or false
|
50
|
+
# :filter gets assigned to :ip_address as default
|
51
|
+
# One could do
|
52
|
+
# is_impressionable :counter_cache => true, :unique => :any_other_colum
|
53
|
+
def what_is_unique?
|
54
|
+
cache_options[:unique].to_s =~ /true|false/
|
55
|
+
end
|
56
|
+
|
57
|
+
def filter(filter_will_be)
|
58
|
+
{:filter => filter_will_be.to_sym}
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
data/test_app/Gemfile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
gem 'rails', '3.2.
|
3
|
+
gem 'rails', '3.2.12'
|
4
4
|
|
5
5
|
gem 'impressionist', :path => '../'
|
6
6
|
|
@@ -41,7 +41,7 @@ group :test do
|
|
41
41
|
gem 'systemu'
|
42
42
|
end
|
43
43
|
|
44
|
-
|
44
|
+
gem 'jquery-rails'
|
45
45
|
|
46
46
|
# To use ActiveModel has_secure_password
|
47
47
|
# gem 'bcrypt-ruby', '~> 3.0.0'
|
@@ -3,8 +3,9 @@ require 'spec_helper'
|
|
3
3
|
describe Impression do
|
4
4
|
fixtures :widgets
|
5
5
|
|
6
|
+
let(:widget) { Widget.find(1) }
|
7
|
+
|
6
8
|
before(:each) do
|
7
|
-
@widget = Widget.find(1)
|
8
9
|
Impression.destroy_all
|
9
10
|
end
|
10
11
|
|
@@ -33,17 +34,17 @@ describe Impression do
|
|
33
34
|
|
34
35
|
describe "#update_impressionist_counter_cache" do
|
35
36
|
it "should update the counter cache column to reflect the correct number of impressions" do
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
}.
|
37
|
+
expect {
|
38
|
+
widget.impressions.create(:request_hash => 'abcd1234')
|
39
|
+
widget.reload
|
40
|
+
}.to change(widget, :impressions_count).from(0).to(1)
|
40
41
|
end
|
41
42
|
|
42
43
|
it "should not update the timestamp on the impressable" do
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
}.
|
44
|
+
expect {
|
45
|
+
widget.impressions.create(:request_hash => 'abcd1234')
|
46
|
+
widget.reload
|
47
|
+
}.to_not change(widget, :updated_at)
|
47
48
|
end
|
48
49
|
end
|
49
50
|
|
@@ -51,7 +51,7 @@ describe Impression do
|
|
51
51
|
|
52
52
|
# tests :dependent => :destroy
|
53
53
|
it "should delete impressions on deletion of impressionable" do
|
54
|
-
impressions_count = Impression.all.size
|
54
|
+
#impressions_count = Impression.all.size
|
55
55
|
a = Article.create
|
56
56
|
i = a.impressions.create
|
57
57
|
a.destroy
|
@@ -59,36 +59,4 @@ describe Impression do
|
|
59
59
|
i.destroyed?.should be_true
|
60
60
|
end
|
61
61
|
|
62
|
-
#OLD COUNT METHODS. DEPRECATE SOON
|
63
|
-
it "should return the impression count with no date range specified" do
|
64
|
-
@article.impression_count.should eq 11
|
65
|
-
end
|
66
|
-
|
67
|
-
it "should return unique impression count with no date range specified" do
|
68
|
-
@article.unique_impression_count.should eq 9
|
69
|
-
end
|
70
|
-
|
71
|
-
it "should return impression count with only start date specified" do
|
72
|
-
@article.impression_count("2011-01-01").should eq 8
|
73
|
-
end
|
74
|
-
|
75
|
-
it "should return impression count with whole date range specified" do
|
76
|
-
@article.impression_count("2011-01-01","2011-01-02").should eq 7
|
77
|
-
end
|
78
|
-
|
79
|
-
it "should return unique impression count with only start date specified" do
|
80
|
-
@article.unique_impression_count("2011-01-01").should eq 7
|
81
|
-
end
|
82
|
-
|
83
|
-
it "should return unique impression count with date range specified" do
|
84
|
-
@article.unique_impression_count("2011-01-01","2011-01-02").should eq 7
|
85
|
-
end
|
86
|
-
|
87
|
-
it "should return unique impression count using ip address (which in turn eliminates duplicate request_hashes)" do
|
88
|
-
@article.unique_impression_count_ip.should eq 8
|
89
|
-
end
|
90
|
-
|
91
|
-
it "should return unique impression count using session_hash (which in turn eliminates duplicate request_hashes)" do
|
92
|
-
@article.unique_impression_count_session.should eq 7
|
93
|
-
end
|
94
62
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: impressionist
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- johnmcaliley
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-06
|
11
|
+
date: 2013-07-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httpclient
|
@@ -178,13 +178,17 @@ files:
|
|
178
178
|
- lib/impressionist.rb
|
179
179
|
- lib/impressionist/bots.rb
|
180
180
|
- lib/impressionist/controllers/mongoid/impressionist_controller.rb
|
181
|
+
- lib/impressionist/counter_cache.rb
|
181
182
|
- lib/impressionist/engine.rb
|
183
|
+
- lib/impressionist/load.rb
|
182
184
|
- lib/impressionist/models/active_record/impression.rb
|
183
185
|
- lib/impressionist/models/active_record/impressionist/impressionable.rb
|
184
186
|
- lib/impressionist/models/mongo_mapper/impression.rb
|
185
187
|
- lib/impressionist/models/mongo_mapper/impressionist/impressionable.rb
|
186
188
|
- lib/impressionist/models/mongoid/impression.rb
|
187
189
|
- lib/impressionist/models/mongoid/impressionist/impressionable.rb
|
190
|
+
- lib/impressionist/set_up_association.rb
|
191
|
+
- lib/impressionist/update_counters.rb
|
188
192
|
- lib/impressionist/version.rb
|
189
193
|
- logo.png
|
190
194
|
- spec/spec_helper.rb
|