impressionist 1.5.1 → 1.5.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/README.md +18 -6
  4. data/app/controllers/impressionist_controller.rb +53 -12
  5. data/app/models/impressionist/impressionable.rb +1 -1
  6. data/gemfiles/rails32.gemfile +5 -1
  7. data/gemfiles/rails40.gemfile +5 -1
  8. data/impressionist.gemspec +1 -3
  9. data/lib/generators/active_record/templates/create_impressions_table.rb +2 -0
  10. data/lib/impressionist/bots.rb +11 -8
  11. data/lib/impressionist/models/active_record/impression.rb +1 -1
  12. data/lib/impressionist/models/mongoid/impression.rb +1 -1
  13. data/lib/impressionist/setup_association.rb +2 -1
  14. data/lib/impressionist/version.rb +1 -1
  15. data/tests/spec/setup_association_spec.rb +2 -2
  16. data/tests/test_app/.gitignore +1 -0
  17. data/tests/test_app/Gemfile +5 -1
  18. data/tests/test_app/app/controllers/profiles_controller.rb +14 -0
  19. data/tests/test_app/app/controllers/widgets_controller.rb +1 -1
  20. data/tests/test_app/app/models/profile.rb +6 -0
  21. data/tests/test_app/app/views/profiles/show.html.erb +3 -0
  22. data/tests/test_app/config/initializers/impression.rb +1 -1
  23. data/tests/test_app/config/routes.rb +1 -0
  24. data/tests/test_app/db/migrate/20130719024021_create_impressions_table.rb +2 -0
  25. data/tests/test_app/db/migrate/20150207135825_create_profiles.rb +10 -0
  26. data/tests/test_app/db/migrate/20150207140310_create_friendly_id_slugs.rb +18 -0
  27. data/tests/test_app/db/schema.rb +21 -1
  28. data/tests/test_app/spec/controllers/articles_controller_spec.rb +17 -1
  29. data/tests/test_app/spec/controllers/impressionist_uniqueness_spec.rb +146 -60
  30. data/tests/test_app/spec/controllers/posts_controller_spec.rb +9 -0
  31. data/tests/test_app/spec/controllers/widgets_controller_spec.rb +32 -1
  32. data/tests/test_app/spec/fixtures/profiles.yml +4 -0
  33. data/tests/test_app/spec/models/model_spec.rb +1 -1
  34. data/tests/test_app/spec/rails_generators/rails_generators_spec.rb +1 -1
  35. metadata +26 -29
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cb9ffa85fa4e4bcd8eebad92acee8eb81c3f48de
4
- data.tar.gz: 9073d41d76c1eec72dbc44b51fce2c6100269c34
3
+ metadata.gz: 77fe32e3f3573eee145dbc117db77870636488db
4
+ data.tar.gz: 5653b56f9e30cc83ab460ce4ebe14581aea1f0a5
5
5
  SHA512:
6
- metadata.gz: 02d800f34d2d75e3e1605e5abee38c554b874509a3b2d9cd7ea199bb2cfbbda1ccadd6b1e0661b3021ea86eb686e0a632736ef7cc1deef75490d89bc75a4ba88
7
- data.tar.gz: 26147d35e22672d3624340d52c8b8b2649ab65641c7377f9cc5c14f4d01e9c24a2cc2cf42b21a516ee04989aaf15b22d573d856706e5f2a264a09d12166472d6
6
+ metadata.gz: f30282672dfe4b2d8a848f571b6926640433e6131cdc744cd4b73b9c5ff63fd273467b2c0660bf49cb8401ff3223bac7871fa72ce7ac1af46938a4ae2eb0b824
7
+ data.tar.gz: be7b5e08610b3def60b450177dd12aec65b65e1cb9357b062599d760a1c3d0693a09e497d5fec4f2007e8904dcdda55ee29510d1ef1e8cb670886d1b07ff34d1
@@ -2,7 +2,7 @@ language: ruby
2
2
  before_script:
3
3
  - cd tests/test_app
4
4
  - bundle exec rails g impressionist -f
5
- - bundle exec rake db:migrate
5
+ - bundle exec rake db:create db:migrate RAILS_ENV=test
6
6
  - cd ..
7
7
  rvm:
8
8
  - 1.9.3
data/README.md CHANGED
@@ -55,6 +55,7 @@ The following fields are provided in the migration:
55
55
  t.string "request_hash" # unique ID per request, in case you want to log multiple impressions and group them
56
56
  t.string "session_hash" # logs the rails session
57
57
  t.string "ip_address" # request.remote_ip
58
+ t.text "params" # request.params, except action name, controller name and resource id
58
59
  t.string "referrer" # request.referer
59
60
  t.string "message" # custom message you can add
60
61
  t.datetime "created_at" # I am not sure what this is.... Any clue?
@@ -79,7 +80,7 @@ Usage
79
80
  an AR model instance. Impressionist will automatically log the Model name
80
81
  (based on action_name) and the id (based on params[:id]), but in order to
81
82
  get the count of impressions (example: @widget.impression_count), you will
82
- need to make your model impressionalble
83
+ need to make your model impressionable
83
84
 
84
85
  class Widget < ActiveRecord::Base
85
86
  is_impressionable
@@ -89,11 +90,14 @@ Usage
89
90
  not necessary to specify "impressionist" (usage #1) in the top of you
90
91
  controller if you are using this method. If you add "impressionist" to the
91
92
  top of your controller and also use this method in your action, it will
92
- result in 2 impressions being logged (but associated with one request_hash)
93
+ result in 2 impressions being logged (but associated with one request_hash).
94
+ If you're using [friendly_id](https://github.com/norman/friendly_id) be sure
95
+ to log impressionist this way, as params[:id] will return a string(url slug)
96
+ while impressionable_id is a Integer column in database.
93
97
 
94
98
  def show
95
99
  @widget = Widget.find
96
- impressionist(@widget,message:"wtf is a widget?") #message is optional
100
+ impressionist(@widget, "message...") # 2nd argument is optional
97
101
  end
98
102
 
99
103
  5. Get unique impression count from a model. This groups impressions by
@@ -111,7 +115,12 @@ Usage
111
115
 
112
116
  @widget.impressionist_count(:filter=>:ip_address)
113
117
 
114
- 7. Get the unique impression count from a model filtered by session hash. Same
118
+ 7. Get the unique impression count from a model filtered by params. This
119
+ in turn will give you impressions with unique params.
120
+
121
+ @widget.impressionist_count(:filter => :params)
122
+
123
+ 8. Get the unique impression count from a model filtered by session hash. Same
115
124
  as #6 regarding request hash. This may be more desirable than filtering by
116
125
  IP address depending on your situation, since filtering by IP may ignore
117
126
  visitors that use the same IP. The downside to this filtering is that a
@@ -119,12 +128,12 @@ Usage
119
128
 
120
129
  @widget.impressionist_count(:filter=>:session_hash)
121
130
 
122
- 8. Get total impression count. This may return more than 1 impression per http
131
+ 9. Get total impression count. This may return more than 1 impression per http
123
132
  request, depending on how you are logging impressions
124
133
 
125
134
  @widget.impressionist_count(:filter=>:all)
126
135
 
127
- 9. Get impression count by message. This only counts impressions of the given message.
136
+ 10. Get impression count by message. This only counts impressions of the given message.
128
137
 
129
138
  @widget.impressionist_count(:message=>"pageview", :filter=>:all)
130
139
 
@@ -179,6 +188,9 @@ impressions in your controller:
179
188
 
180
189
  # only record impression if session is unique
181
190
  impressionist :unique => [:session_hash]
191
+
192
+ # only record impression if param is unique
193
+ impressionist :unique => [:params]
182
194
 
183
195
  Or you can use the `impressionist` method directly:
184
196
 
@@ -3,7 +3,7 @@ require 'digest/sha2'
3
3
  module ImpressionistController
4
4
  module ClassMethods
5
5
  def impressionist(opts={})
6
- before_filter { |c| c.impressionist_subapp_filter(opts[:actions], opts[:unique])}
6
+ before_filter { |c| c.impressionist_subapp_filter(opts) }
7
7
  end
8
8
  end
9
9
 
@@ -13,7 +13,7 @@ module ImpressionistController
13
13
  end
14
14
 
15
15
  def impressionist(obj,message=nil,opts={})
16
- unless bypass
16
+ if should_count_impression?(opts)
17
17
  if obj.respond_to?("impressionable?")
18
18
  if unique_instance?(obj, opts[:unique])
19
19
  obj.impressions.create(associative_create_statement({:message => message}))
@@ -29,10 +29,11 @@ module ImpressionistController
29
29
  @impressionist_hash = Digest::SHA2.hexdigest(Time.now.to_f.to_s+rand(10000).to_s)
30
30
  end
31
31
 
32
- def impressionist_subapp_filter(actions=nil,unique_opts=nil)
33
- unless bypass
32
+ def impressionist_subapp_filter(opts = {})
33
+ if should_count_impression?(opts)
34
+ actions = opts[:actions]
34
35
  actions.collect!{|a|a.to_s} unless actions.blank?
35
- if (actions.blank? || actions.include?(action_name)) && unique?(unique_opts)
36
+ if (actions.blank? || actions.include?(action_name)) && unique?(opts[:unique])
36
37
  Impression.create(direct_create_statement)
37
38
  end
38
39
  end
@@ -49,7 +50,8 @@ module ImpressionistController
49
50
  :request_hash => @impressionist_hash,
50
51
  :session_hash => session_hash,
51
52
  :ip_address => request.remote_ip,
52
- :referrer => request.referer
53
+ :referrer => request.referer,
54
+ :params => params_hash
53
55
  )
54
56
  end
55
57
 
@@ -59,17 +61,52 @@ module ImpressionistController
59
61
  Impressionist::Bots.bot?(request.user_agent)
60
62
  end
61
63
 
64
+ def should_count_impression?(opts)
65
+ !bypass && condition_true?(opts[:if]) && condition_false?(opts[:unless])
66
+ end
67
+
68
+ def condition_true?(condition)
69
+ condition.present? ? conditional?(condition) : true
70
+ end
71
+
72
+ def condition_false?(condition)
73
+ condition.present? ? !conditional?(condition) : true
74
+ end
75
+
76
+ def conditional?(condition)
77
+ condition.is_a?(Symbol) ? self.send(condition) : condition.call
78
+ end
79
+
62
80
  def unique_instance?(impressionable, unique_opts)
63
- return unique_opts.blank? || !impressionable.impressions.where(unique_query(unique_opts)).exists?
81
+ return unique_opts.blank? || !impressionable.impressions.where(unique_query(unique_opts, impressionable)).exists?
64
82
  end
65
83
 
66
84
  def unique?(unique_opts)
67
- return unique_opts.blank? || !Impression.where(unique_query(unique_opts)).exists?
85
+ return unique_opts.blank? || check_impression?(unique_opts)
68
86
  end
69
87
 
88
+ def check_impression?(unique_opts)
89
+ impressions = Impression.where(unique_query(unique_opts - [:params]))
90
+ check_unique_impression?(impressions, unique_opts)
91
+ end
92
+
93
+ def check_unique_impression?(impressions, unique_opts)
94
+ impressions_present = impressions.exists?
95
+ impressions_present && unique_opts_has_params?(unique_opts) ? check_unique_with_params?(impressions) : !impressions_present
96
+ end
97
+
98
+ def unique_opts_has_params?(unique_opts)
99
+ unique_opts.include?(:params)
100
+ end
101
+
102
+ def check_unique_with_params?(impressions)
103
+ request_param = params_hash
104
+ impressions.detect{|impression| impression.params == request_param }.nil?
105
+ end
106
+
70
107
  # creates the query to check for uniqueness
71
- def unique_query(unique_opts)
72
- full_statement = direct_create_statement
108
+ def unique_query(unique_opts,impressionable=nil)
109
+ full_statement = direct_create_statement({},impressionable)
73
110
  # reduce the full statement to the params we need for the specified unique options
74
111
  unique_opts.reduce({}) do |query, param|
75
112
  query[param] = full_statement[param]
@@ -78,10 +115,10 @@ module ImpressionistController
78
115
  end
79
116
 
80
117
  # creates a statment hash that contains default values for creating an impression.
81
- def direct_create_statement(query_params={})
118
+ def direct_create_statement(query_params={},impressionable=nil)
82
119
  query_params.reverse_merge!(
83
120
  :impressionable_type => controller_name.singularize.camelize,
84
- :impressionable_id=> params[:id]
121
+ :impressionable_id => impressionable.present? ? impressionable.id : params[:id]
85
122
  )
86
123
  associative_create_statement(query_params)
87
124
  end
@@ -95,6 +132,10 @@ module ImpressionistController
95
132
  request.session_options[:id]
96
133
  end
97
134
 
135
+ def params_hash
136
+ request.params.except(:controller, :action, :id)
137
+ end
138
+
98
139
  #use both @current_user and current_user helper
99
140
  def user_id
100
141
  user_id = @current_user ? @current_user.id : nil rescue nil
@@ -41,7 +41,7 @@ module Impressionist
41
41
 
42
42
  # Count all distinct impressions unless the :all filter is provided.
43
43
  distinct = options[:filter] != :all
44
- if Rails::VERSION::MAJOR == 4
44
+ if Rails::VERSION::MAJOR >= 4
45
45
  distinct ? imps.select(options[:filter]).distinct.count : imps.count
46
46
  else
47
47
  distinct ? imps.count(options[:filter], :distinct => true) : imps.count
@@ -18,9 +18,13 @@ group :test do
18
18
  gem 'minitest'
19
19
  gem 'minitest-rails'
20
20
  gem 'rails', '~> 3.2.15'
21
- gem 'rspec-rails'
21
+ gem 'rspec-rails', '~> 2.14.0'
22
22
  gem 'simplecov'
23
23
  gem 'systemu'
24
+ gem 'friendly_id', '~> 4.0.9'
25
+
26
+ # test/unit has been removed by default in Ruby 2.2.x+
27
+ gem 'test-unit'
24
28
  end
25
29
 
26
30
  gemspec :path => '../'
@@ -18,9 +18,13 @@ group :test do
18
18
  gem 'minitest'
19
19
  gem 'minitest-rails'
20
20
  gem 'rails', '~> 4.0.1'
21
- gem 'rspec-rails'
21
+ gem 'rspec-rails', '~> 2.14.0'
22
22
  gem 'simplecov'
23
23
  gem 'systemu'
24
+ gem 'friendly_id', '~> 5.1.0'
25
+
26
+ # test/unit has been removed by default in Ruby 2.2.x+
27
+ gem 'test-unit'
24
28
  end
25
29
 
26
30
  gemspec :path => '../'
@@ -18,8 +18,6 @@ Gem::Specification.new do |s|
18
18
  s.require_path = 'lib'
19
19
  s.required_rubygems_version = Gem::Requirement.new('>= 1.3.6') if s.respond_to? :required_rubygems_version=
20
20
 
21
- s.add_dependency 'httpclient', '~> 2.2'
22
- s.add_dependency 'nokogiri', '~> 1.5'
23
-
21
+ s.add_dependency 'nokogiri', '~> 1.6'
24
22
  s.add_development_dependency 'bundler', '~> 1.0'
25
23
  end
@@ -12,6 +12,7 @@ class CreateImpressionsTable < ActiveRecord::Migration
12
12
  t.string :session_hash
13
13
  t.text :message
14
14
  t.text :referrer
15
+ t.text :params
15
16
  t.timestamps
16
17
  end
17
18
  add_index :impressions, [:impressionable_type, :message, :impressionable_id], :name => "impressionable_type_message_index", :unique => false, :length => {:message => 255 }
@@ -21,6 +22,7 @@ class CreateImpressionsTable < ActiveRecord::Migration
21
22
  add_index :impressions, [:controller_name,:action_name,:request_hash], :name => "controlleraction_request_index", :unique => false
22
23
  add_index :impressions, [:controller_name,:action_name,:ip_address], :name => "controlleraction_ip_index", :unique => false
23
24
  add_index :impressions, [:controller_name,:action_name,:session_hash], :name => "controlleraction_session_index", :unique => false
25
+ add_index :impressions, [:impressionable_type, :impressionable_id, :params], :name => "poly_params_request_index", :unique => false
24
26
  add_index :impressions, :user_id
25
27
  end
26
28
 
@@ -1,18 +1,21 @@
1
- require 'httpclient'
1
+ require 'timeout'
2
+ require 'net/http'
2
3
  require 'nokogiri'
3
4
 
4
5
  module Impressionist
5
6
  module Bots
6
7
  LIST_URL = "http://www.user-agents.org/allagents.xml"
7
8
  def self.consume
8
- response = HTTPClient.new.get_content(LIST_URL)
9
- doc = Nokogiri::XML(response)
10
- list = []
11
- doc.xpath('//user-agent').each do |agent|
12
- type = agent.xpath("Type").text
13
- list << agent.xpath("String").text.gsub("&lt;","<") if ["R","S"].include?(type) #gsub hack for badly formatted data
9
+ Timeout.timeout(4) do
10
+ response = Net::HTTP.get(URI.parse(LIST_URL))
11
+ doc = Nokogiri::XML(response)
12
+ list = []
13
+ doc.xpath('//user-agent').each do |agent|
14
+ type = agent.xpath("Type").text
15
+ list << agent.xpath("String").text.gsub("&lt;","<") if ["R","S"].include?(type) #gsub hack for badly formatted data
16
+ end
17
+ list
14
18
  end
15
- list
16
19
  end
17
20
  end
18
21
  end
@@ -9,6 +9,6 @@ class Impression < ActiveRecord::Base
9
9
  # sets belongs_to and attr_accessible depending on Rails version
10
10
  Impressionist::SetupAssociation.new(self).set
11
11
 
12
+ store :params
12
13
  after_save :impressionable_counter_cache_updatable?
13
-
14
14
  end
@@ -8,7 +8,7 @@ class Impression
8
8
  include Impressionist::CounterCache
9
9
  Impressionist::SetupAssociation.new(self).set
10
10
 
11
- field :impressionable_id
11
+ field :impressionable_id, type: BSON::ObjectId
12
12
  field :impressionable_type
13
13
  field :user_id
14
14
  field :controller_name
@@ -35,7 +35,8 @@ module Impressionist
35
35
  :view_name,
36
36
  :referrer,
37
37
  :message,
38
- :user_id)
38
+ :user_id,
39
+ :params)
39
40
  end
40
41
 
41
42
  def toggle
@@ -1,3 +1,3 @@
1
1
  module Impressionist
2
- VERSION = "1.5.1"
2
+ VERSION = "1.5.2"
3
3
  end
@@ -9,10 +9,10 @@ module Impressionist
9
9
 
10
10
  before do
11
11
  # expects attr_accessible to return true
12
- # and pass 11 arguments
12
+ # and pass 12 arguments
13
13
  mock.
14
14
  expect(:attr_accessible, true) do |args|
15
- args.size == 11
15
+ args.size == 12
16
16
  end
17
17
 
18
18
  end
@@ -15,3 +15,4 @@
15
15
  /coverage
16
16
  /log/*.log
17
17
  /tmp
18
+ /.idea
@@ -34,8 +34,11 @@ end
34
34
 
35
35
  group :development, :test do
36
36
  gem 'autotest-notification'
37
- gem 'rspec-rails'
37
+ gem 'rspec-rails', '~> 2.14.0'
38
38
  gem 'spork'
39
+
40
+ # test/unit has been removed by default in Ruby 2.2.x+
41
+ gem 'test-unit'
39
42
  end
40
43
 
41
44
  group :test do
@@ -45,3 +48,4 @@ group :test do
45
48
  end
46
49
 
47
50
  gem 'jquery-rails'
51
+ gem 'friendly_id', '~> 4.0.9'
@@ -0,0 +1,14 @@
1
+ class ProfilesController < ApplicationController
2
+ helper_method :current_user
3
+
4
+ def show
5
+ end
6
+
7
+ def current_user
8
+ if session[:user_id]
9
+ user = User.new
10
+ user.id = session[:user_id]
11
+ @current_user ||= user
12
+ end
13
+ end
14
+ end
@@ -1,5 +1,5 @@
1
1
  class WidgetsController < ApplicationController
2
- impressionist :actions=>[:show,:index], :unique => [:controller_name,:action_name,:impressionable_id]
2
+ impressionist :actions=>[:show, :index], :unique => [:controller_name, :action_name, :impressionable_id, :params]
3
3
 
4
4
  def show
5
5
  end
@@ -0,0 +1,6 @@
1
+ class Profile < ActiveRecord::Base
2
+ extend FriendlyId
3
+
4
+ friendly_id :username, use: :slugged
5
+ is_impressionable
6
+ end
@@ -0,0 +1,3 @@
1
+ <h2>User Public Profile</h2>
2
+
3
+ <p>User Name: <%= @profile.username %></p>
@@ -5,4 +5,4 @@
5
5
  #end
6
6
 
7
7
 
8
- Impressionist.orm = :active_record
8
+
@@ -1,3 +1,4 @@
1
1
  TestApp::Application.routes.draw do
2
2
  resources :articles, :posts, :widgets, :dummy
3
+ get 'profiles/[:id]' => 'profiles#show'
3
4
  end
@@ -11,6 +11,7 @@ class CreateImpressionsTable < ActiveRecord::Migration
11
11
  t.string :ip_address
12
12
  t.string :session_hash
13
13
  t.text :message
14
+ t.text :params
14
15
  t.text :referrer
15
16
  t.timestamps
16
17
  end
@@ -21,6 +22,7 @@ class CreateImpressionsTable < ActiveRecord::Migration
21
22
  add_index :impressions, [:controller_name,:action_name,:request_hash], :name => "controlleraction_request_index", :unique => false
22
23
  add_index :impressions, [:controller_name,:action_name,:ip_address], :name => "controlleraction_ip_index", :unique => false
23
24
  add_index :impressions, [:controller_name,:action_name,:session_hash], :name => "controlleraction_session_index", :unique => false
25
+ add_index :impressions, [:impressionable_type, :impressionable_id, :params], :name => "poly_params_request_index", :unique => false
24
26
  add_index :impressions, :user_id
25
27
  end
26
28
 
@@ -0,0 +1,10 @@
1
+ class CreateProfiles < ActiveRecord::Migration
2
+ def change
3
+ create_table :profiles do |t|
4
+ t.string :username
5
+ t.string :slug
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,18 @@
1
+ class CreateFriendlyIdSlugs < ActiveRecord::Migration
2
+
3
+ def self.up
4
+ create_table :friendly_id_slugs do |t|
5
+ t.string :slug, :null => false
6
+ t.integer :sluggable_id, :null => false
7
+ t.string :sluggable_type, :limit => 40
8
+ t.datetime :created_at
9
+ end
10
+ add_index :friendly_id_slugs, :sluggable_id
11
+ add_index :friendly_id_slugs, [:slug, :sluggable_type], :unique => true
12
+ add_index :friendly_id_slugs, :sluggable_type
13
+ end
14
+
15
+ def self.down
16
+ drop_table :friendly_id_slugs
17
+ end
18
+ end
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # It's strongly recommended to check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(:version => 20130719024021) do
14
+ ActiveRecord::Schema.define(:version => 20150207140310) do
15
15
 
16
16
  create_table "articles", :force => true do |t|
17
17
  t.string "name"
@@ -19,6 +19,17 @@ ActiveRecord::Schema.define(:version => 20130719024021) do
19
19
  t.datetime "updated_at", :null => false
20
20
  end
21
21
 
22
+ create_table "friendly_id_slugs", :force => true do |t|
23
+ t.string "slug", :null => false
24
+ t.integer "sluggable_id", :null => false
25
+ t.string "sluggable_type", :limit => 40
26
+ t.datetime "created_at"
27
+ end
28
+
29
+ add_index "friendly_id_slugs", ["slug", "sluggable_type"], :name => "index_friendly_id_slugs_on_slug_and_sluggable_type", :unique => true
30
+ add_index "friendly_id_slugs", ["sluggable_id"], :name => "index_friendly_id_slugs_on_sluggable_id"
31
+ add_index "friendly_id_slugs", ["sluggable_type"], :name => "index_friendly_id_slugs_on_sluggable_type"
32
+
22
33
  create_table "impressions", :force => true do |t|
23
34
  t.string "impressionable_type"
24
35
  t.integer "impressionable_id"
@@ -30,6 +41,7 @@ ActiveRecord::Schema.define(:version => 20130719024021) do
30
41
  t.string "ip_address"
31
42
  t.string "session_hash"
32
43
  t.text "message"
44
+ t.text "params"
33
45
  t.text "referrer"
34
46
  t.datetime "created_at", :null => false
35
47
  t.datetime "updated_at", :null => false
@@ -39,6 +51,7 @@ ActiveRecord::Schema.define(:version => 20130719024021) do
39
51
  add_index "impressions", ["controller_name", "action_name", "request_hash"], :name => "controlleraction_request_index"
40
52
  add_index "impressions", ["controller_name", "action_name", "session_hash"], :name => "controlleraction_session_index"
41
53
  add_index "impressions", ["impressionable_type", "impressionable_id", "ip_address"], :name => "poly_ip_index"
54
+ add_index "impressions", ["impressionable_type", "impressionable_id", "params"], :name => "poly_params_request_index"
42
55
  add_index "impressions", ["impressionable_type", "impressionable_id", "request_hash"], :name => "poly_request_index"
43
56
  add_index "impressions", ["impressionable_type", "impressionable_id", "session_hash"], :name => "poly_session_index"
44
57
  add_index "impressions", ["impressionable_type", "message", "impressionable_id"], :name => "impressionable_type_message_index"
@@ -50,6 +63,13 @@ ActiveRecord::Schema.define(:version => 20130719024021) do
50
63
  t.datetime "updated_at", :null => false
51
64
  end
52
65
 
66
+ create_table "profiles", :force => true do |t|
67
+ t.string "username"
68
+ t.string "slug"
69
+ t.datetime "created_at", :null => false
70
+ t.datetime "updated_at", :null => false
71
+ end
72
+
53
73
  create_table "widgets", :force => true do |t|
54
74
  t.string "name"
55
75
  t.integer "impressions_count", :default => 0
@@ -53,8 +53,24 @@ describe ArticlesController do
53
53
  click_link "Same Page"
54
54
  Impression.last.referrer.should eq "http://test.host/articles/1"
55
55
  end
56
- end
57
56
 
57
+ it "should log request with params (checked = true)" do
58
+ get "show", id: 1, checked: true
59
+ Impression.last.params.should eq({"checked"=>true})
60
+ Impression.last.request_hash.size.should eq 64
61
+ Impression.last.ip_address.should eq "0.0.0.0"
62
+ Impression.last.session_hash.size.should eq 32
63
+ Impression.last.referrer.should eq nil
64
+ end
58
65
 
66
+ it "should log request with params {}" do
67
+ get "index"
68
+ Impression.last.params.should eq({})
69
+ Impression.last.request_hash.size.should eq 64
70
+ Impression.last.ip_address.should eq "0.0.0.0"
71
+ Impression.last.session_hash.size.should eq 32
72
+ Impression.last.referrer.should eq nil
73
+ end
74
+ end
59
75
 
60
76
 
@@ -10,63 +10,63 @@ describe DummyController do
10
10
  describe "impressionist filter uniqueness" do
11
11
 
12
12
  it "should ignore uniqueness if not requested" do
13
- controller.impressionist_subapp_filter(nil, nil)
14
- controller.impressionist_subapp_filter(nil, nil)
13
+ controller.impressionist_subapp_filter
14
+ controller.impressionist_subapp_filter
15
15
  Impression.should have(@impression_count + 2).records
16
16
  end
17
17
 
18
18
  it "should recognize unique session" do
19
19
  controller.stub(:session_hash).and_return(request.session_options[:id])
20
- controller.impressionist_subapp_filter(nil, [:session_hash])
21
- controller.impressionist_subapp_filter(nil, [:session_hash])
20
+ controller.impressionist_subapp_filter(unique: [:session_hash])
21
+ controller.impressionist_subapp_filter(unique: [:session_hash])
22
22
  Impression.should have(@impression_count + 1).records
23
23
  end
24
24
 
25
25
  it "should recognize unique ip" do
26
26
  controller.request.stub(:remote_ip).and_return("1.2.3.4")
27
- controller.impressionist_subapp_filter(nil, [:ip_address])
28
- controller.impressionist_subapp_filter(nil, [:ip_address])
27
+ controller.impressionist_subapp_filter(unique: [:ip_address])
28
+ controller.impressionist_subapp_filter(unique: [:ip_address])
29
29
  Impression.should have(@impression_count + 1).records
30
30
  end
31
31
 
32
32
  it "should recognize unique request" do
33
- controller.impressionist_subapp_filter(nil, [:request_hash])
34
- controller.impressionist_subapp_filter(nil, [:request_hash])
33
+ controller.impressionist_subapp_filter(unique: [:request_hash])
34
+ controller.impressionist_subapp_filter(unique: [:request_hash])
35
35
  Impression.should have(@impression_count + 1).records
36
36
  end
37
37
 
38
38
  it "should recognize unique action" do
39
39
  controller.stub(:action_name).and_return("test_action")
40
- controller.impressionist_subapp_filter(nil, [:action_name])
41
- controller.impressionist_subapp_filter(nil, [:action_name])
40
+ controller.impressionist_subapp_filter(unique: [:action_name])
41
+ controller.impressionist_subapp_filter(unique: [:action_name])
42
42
  Impression.should have(@impression_count + 1).records
43
43
  end
44
44
 
45
45
  it "should recognize unique controller" do
46
46
  controller.stub(:controller_name).and_return("post")
47
- controller.impressionist_subapp_filter(nil, [:controller_name])
48
- controller.impressionist_subapp_filter(nil, [:controller_name])
47
+ controller.impressionist_subapp_filter(unique: [:controller_name])
48
+ controller.impressionist_subapp_filter(unique: [:controller_name])
49
49
  Impression.should have(@impression_count + 1).records
50
50
  end
51
51
 
52
52
  it "should recognize unique user" do
53
53
  controller.stub(:user_id).and_return(42)
54
- controller.impressionist_subapp_filter(nil, [:user_id])
55
- controller.impressionist_subapp_filter(nil, [:user_id])
54
+ controller.impressionist_subapp_filter(unique: [:user_id])
55
+ controller.impressionist_subapp_filter(unique: [:user_id])
56
56
  Impression.should have(@impression_count + 1).records
57
57
  end
58
58
 
59
59
  it "should recognize unique referer" do
60
60
  controller.request.stub(:referer).and_return("http://foo/bar")
61
- controller.impressionist_subapp_filter(nil, [:referrer])
62
- controller.impressionist_subapp_filter(nil, [:referrer])
61
+ controller.impressionist_subapp_filter(unique: [:referrer])
62
+ controller.impressionist_subapp_filter(unique: [:referrer])
63
63
  Impression.should have(@impression_count + 1).records
64
64
  end
65
65
 
66
66
  it "should recognize unique id" do
67
67
  controller.stub(:params).and_return({:id => "666"}) # for correct impressionable id in filter
68
- controller.impressionist_subapp_filter(nil, [:impressionable_id])
69
- controller.impressionist_subapp_filter(nil, [:impressionable_id])
68
+ controller.impressionist_subapp_filter(unique: [:impressionable_id])
69
+ controller.impressionist_subapp_filter(unique: [:impressionable_id])
70
70
  Impression.should have(@impression_count + 1).records
71
71
  end
72
72
 
@@ -74,104 +74,104 @@ describe DummyController do
74
74
  it "should recognize different controller and action" do
75
75
  controller.stub(:controller_name).and_return("post")
76
76
  controller.stub(:action_name).and_return("test_action")
77
- controller.impressionist_subapp_filter(nil, [:controller_name, :action_name])
78
- controller.impressionist_subapp_filter(nil, [:controller_name, :action_name])
77
+ controller.impressionist_subapp_filter(unique: [:controller_name, :action_name])
78
+ controller.impressionist_subapp_filter(unique: [:controller_name, :action_name])
79
79
  Impression.should have(@impression_count + 1).records
80
80
  controller.stub(:action_name).and_return("another_action")
81
- controller.impressionist_subapp_filter(nil, [:controller_name, :action_name])
82
- controller.impressionist_subapp_filter(nil, [:controller_name, :action_name])
81
+ controller.impressionist_subapp_filter(unique: [:controller_name, :action_name])
82
+ controller.impressionist_subapp_filter(unique: [:controller_name, :action_name])
83
83
  Impression.should have(@impression_count + 2).records
84
84
  controller.stub(:controller_name).and_return("article")
85
- controller.impressionist_subapp_filter(nil, [:controller_name, :action_name])
86
- controller.impressionist_subapp_filter(nil, [:controller_name, :action_name])
85
+ controller.impressionist_subapp_filter(unique: [:controller_name, :action_name])
86
+ controller.impressionist_subapp_filter(unique: [:controller_name, :action_name])
87
87
  Impression.should have(@impression_count + 3).records
88
88
  end
89
89
 
90
90
  it "should recognize different action" do
91
91
  controller.stub(:action_name).and_return("test_action")
92
- controller.impressionist_subapp_filter(nil, [:action_name])
93
- controller.impressionist_subapp_filter(nil, [:action_name])
92
+ controller.impressionist_subapp_filter(unique: [:action_name])
93
+ controller.impressionist_subapp_filter(unique: [:action_name])
94
94
  Impression.should have(@impression_count + 1).records
95
95
  controller.stub(:action_name).and_return("another_action")
96
- controller.impressionist_subapp_filter(nil, [:action_name])
97
- controller.impressionist_subapp_filter(nil, [:action_name])
96
+ controller.impressionist_subapp_filter(unique: [:action_name])
97
+ controller.impressionist_subapp_filter(unique: [:action_name])
98
98
  Impression.should have(@impression_count + 2).records
99
99
  end
100
100
 
101
101
  it "should recognize different controller" do
102
102
  controller.stub(:controller_name).and_return("post")
103
- controller.impressionist_subapp_filter(nil, [:controller_name])
104
- controller.impressionist_subapp_filter(nil, [:controller_name])
103
+ controller.impressionist_subapp_filter(unique: [:controller_name])
104
+ controller.impressionist_subapp_filter(unique: [:controller_name])
105
105
  Impression.should have(@impression_count + 1).records
106
106
  controller.stub(:controller_name).and_return("article")
107
- controller.impressionist_subapp_filter(nil, [:controller_name])
108
- controller.impressionist_subapp_filter(nil, [:controller_name])
107
+ controller.impressionist_subapp_filter(unique: [:controller_name])
108
+ controller.impressionist_subapp_filter(unique: [:controller_name])
109
109
  Impression.should have(@impression_count + 2).records
110
110
  end
111
111
 
112
112
  it "should recognize different session" do
113
113
  controller.stub(:session_hash).and_return("foo")
114
- controller.impressionist_subapp_filter(nil, [:session_hash])
115
- controller.impressionist_subapp_filter(nil, [:session_hash])
114
+ controller.impressionist_subapp_filter(unique: [:session_hash])
115
+ controller.impressionist_subapp_filter(unique: [:session_hash])
116
116
  Impression.should have(@impression_count + 1).records
117
117
  controller.stub(:session_hash).and_return("bar")
118
- controller.impressionist_subapp_filter(nil, [:session_hash])
119
- controller.impressionist_subapp_filter(nil, [:session_hash])
118
+ controller.impressionist_subapp_filter(unique: [:session_hash])
119
+ controller.impressionist_subapp_filter(unique: [:session_hash])
120
120
  Impression.should have(@impression_count + 2).records
121
121
  end
122
122
 
123
123
  it "should recognize different ip" do
124
124
  controller.request.stub(:remote_ip).and_return("1.2.3.4")
125
- controller.impressionist_subapp_filter(nil, [:ip_address])
126
- controller.impressionist_subapp_filter(nil, [:ip_address])
125
+ controller.impressionist_subapp_filter(unique: [:ip_address])
126
+ controller.impressionist_subapp_filter(unique: [:ip_address])
127
127
  Impression.should have(@impression_count + 1).records
128
128
  controller.request.stub(:remote_ip).and_return("5.6.7.8")
129
- controller.impressionist_subapp_filter(nil, [:ip_address])
130
- controller.impressionist_subapp_filter(nil, [:ip_address])
129
+ controller.impressionist_subapp_filter(unique: [:ip_address])
130
+ controller.impressionist_subapp_filter(unique: [:ip_address])
131
131
  Impression.should have(@impression_count + 2).records
132
132
  end
133
133
 
134
134
  it "should recognize different referer" do
135
135
  controller.request.stub(:referer).and_return("http://foo/bar")
136
- controller.impressionist_subapp_filter(nil, [:referrer])
137
- controller.impressionist_subapp_filter(nil, [:referrer])
136
+ controller.impressionist_subapp_filter(unique: [:referrer])
137
+ controller.impressionist_subapp_filter(unique: [:referrer])
138
138
  Impression.should have(@impression_count + 1).records
139
139
  controller.request.stub(:referer).and_return("http://bar/fo")
140
- controller.impressionist_subapp_filter(nil, [:referrer])
141
- controller.impressionist_subapp_filter(nil, [:referrer])
140
+ controller.impressionist_subapp_filter(unique: [:referrer])
141
+ controller.impressionist_subapp_filter(unique: [:referrer])
142
142
  Impression.should have(@impression_count + 2).records
143
143
  end
144
144
 
145
145
  it "should recognize different id" do
146
146
  controller.stub(:params).and_return({:id => "666"}) # for correct impressionable id in filter
147
- controller.impressionist_subapp_filter(nil, [:impressionable_type, :impressionable_id])
148
- controller.impressionist_subapp_filter(nil, [:impressionable_type, :impressionable_id])
147
+ controller.impressionist_subapp_filter(unique: [:impressionable_type, :impressionable_id])
148
+ controller.impressionist_subapp_filter(unique: [:impressionable_type, :impressionable_id])
149
149
  controller.stub(:params).and_return({:id => "42"}) # for correct impressionable id in filter
150
- controller.impressionist_subapp_filter(nil, [:impressionable_type, :impressionable_id])
151
- controller.impressionist_subapp_filter(nil, [:impressionable_type, :impressionable_id])
150
+ controller.impressionist_subapp_filter(unique: [:impressionable_type, :impressionable_id])
151
+ controller.impressionist_subapp_filter(unique: [:impressionable_type, :impressionable_id])
152
152
  Impression.should have(@impression_count + 2).records
153
153
  end
154
154
 
155
155
  it "should recognize combined uniqueness" do
156
156
  controller.stub(:action_name).and_return("test_action")
157
- controller.impressionist_subapp_filter(nil, [:ip_address, :request_hash, :action_name])
158
- controller.impressionist_subapp_filter(nil, [:request_hash, :ip_address, :action_name])
159
- controller.impressionist_subapp_filter(nil, [:request_hash, :action_name])
160
- controller.impressionist_subapp_filter(nil, [:ip_address, :action_name])
161
- controller.impressionist_subapp_filter(nil, [:ip_address, :request_hash])
162
- controller.impressionist_subapp_filter(nil, [:action_name])
163
- controller.impressionist_subapp_filter(nil, [:ip_address])
164
- controller.impressionist_subapp_filter(nil, [:request_hash])
157
+ controller.impressionist_subapp_filter(unique: [:ip_address, :request_hash, :action_name])
158
+ controller.impressionist_subapp_filter(unique: [:request_hash, :ip_address, :action_name])
159
+ controller.impressionist_subapp_filter(unique: [:request_hash, :action_name])
160
+ controller.impressionist_subapp_filter(unique: [:ip_address, :action_name])
161
+ controller.impressionist_subapp_filter(unique: [:ip_address, :request_hash])
162
+ controller.impressionist_subapp_filter(unique: [:action_name])
163
+ controller.impressionist_subapp_filter(unique: [:ip_address])
164
+ controller.impressionist_subapp_filter(unique: [:request_hash])
165
165
  Impression.should have(@impression_count + 1).records
166
166
  end
167
167
 
168
168
  it "should recognize combined non-uniqueness" do
169
169
  controller.stub(:action_name).and_return(nil)
170
- controller.impressionist_subapp_filter(nil, [:ip_address, :action_name])
170
+ controller.impressionist_subapp_filter(unique: [:ip_address, :action_name])
171
171
  controller.stub(:action_name).and_return("test_action")
172
- controller.impressionist_subapp_filter(nil, [:ip_address, :action_name])
172
+ controller.impressionist_subapp_filter(unique: [:ip_address, :action_name])
173
173
  controller.stub(:action_name).and_return("another_action")
174
- controller.impressionist_subapp_filter(nil, [:ip_address, :action_name])
174
+ controller.impressionist_subapp_filter(unique: [:ip_address, :action_name])
175
175
  Impression.should have(@impression_count + 3).records
176
176
  end
177
177
 
@@ -299,12 +299,98 @@ describe DummyController do
299
299
  controller.stub(:session_hash).and_return("foo")
300
300
  controller.request.stub(:remote_ip).and_return("1.2.3.4")
301
301
  # order of the following methods is important for the test!
302
- controller.impressionist_subapp_filter(nil, [:ip_address, :request_hash, :session_hash])
302
+ controller.impressionist_subapp_filter(unique: [:ip_address, :request_hash, :session_hash])
303
303
  controller.impressionist(impressionable, nil, :unique => [:ip_address, :request_hash, :session_hash])
304
304
  Impression.should have(@impression_count + 1).records
305
305
  end
306
306
 
307
307
  end
308
308
 
309
+ describe 'impressionist with friendly id' do
310
+ it 'should unique' do
311
+ impressionable = Profile.create({username: 'test_profile', slug: 'test_profile'})
312
+
313
+ controller.stub(:controller_name).and_return('profile')
314
+ controller.stub(:action_name).and_return('show')
315
+ controller.stub(:params).and_return({id: impressionable.slug})
316
+ controller.request.stub(:remote_ip).and_return('1.2.3.4')
317
+
318
+ controller.impressionist(impressionable, nil, :unique => [:impressionable_type, :impressionable_id])
319
+ controller.impressionist(impressionable, nil, :unique => [:impressionable_type, :impressionable_id])
320
+ Impression.should have(@impression_count + 1).records
321
+ end
322
+ end
323
+
324
+ shared_examples_for 'an impressionable action' do
325
+ it 'should record an impression' do
326
+ controller.impressionist_subapp_filter(condition)
327
+ Impression.should have(@impression_count + 1).records
328
+ end
329
+ end
330
+
331
+ shared_examples_for 'an unimpressionable action' do
332
+ it 'should record an impression' do
333
+ controller.impressionist_subapp_filter(condition)
334
+ Impression.should have(@impression_count).records
335
+ end
336
+ end
337
+
338
+ describe "conditional impressions" do
339
+ describe ":if condition" do
340
+ context "true condition" do
341
+ before do
342
+ controller.stub(:true_condition).and_return(true)
343
+ end
344
+ it_behaves_like 'an impressionable action' do
345
+ let(:condition) {{ if: :true_condition }}
346
+ end
347
+
348
+ it_behaves_like 'an impressionable action' do
349
+ let(:condition) {{ if: lambda { true } }}
350
+ end
351
+ end
352
+
353
+ context "false condition" do
354
+ before do
355
+ controller.stub(:false_condition).and_return(false)
356
+ end
357
+ it_behaves_like 'an unimpressionable action' do
358
+ let(:condition) {{ if: :false_condition }}
359
+ end
360
+
361
+ it_behaves_like 'an unimpressionable action' do
362
+ let(:condition) {{ if: lambda { false } }}
363
+ end
364
+ end
365
+ end
366
+
367
+ describe ":unless condition" do
368
+ context "true condition" do
369
+ before do
370
+ controller.stub(:true_condition).and_return(true)
371
+ end
372
+ it_behaves_like 'an unimpressionable action' do
373
+ let(:condition) {{ unless: :true_condition }}
374
+ end
375
+
376
+ it_behaves_like 'an unimpressionable action' do
377
+ let(:condition) {{ unless: lambda { true } }}
378
+ end
379
+ end
380
+
381
+ context "false condition" do
382
+ before do
383
+ controller.stub(:false_condition).and_return(false)
384
+ end
385
+ it_behaves_like 'an impressionable action' do
386
+ let(:condition) {{ unless: :false_condition }}
387
+ end
388
+
389
+ it_behaves_like 'an impressionable action' do
390
+ let(:condition) {{ unless: lambda { false } }}
391
+ end
392
+ end
393
+ end
394
+ end
309
395
  end
310
396
 
@@ -16,4 +16,13 @@ describe PostsController do
16
16
  Post.first.impressions.last.user_id.should eq 123
17
17
  end
18
18
 
19
+ it "should log impression at the action level with params" do
20
+ get "show", id: 1, checked: true
21
+ Impression.all.size.should eq 12
22
+ Impression.last.params.should eq({"checked"=>true})
23
+ Impression.last.controller_name.should eq "posts"
24
+ Impression.last.action_name.should eq "show"
25
+ Impression.last.impressionable_type.should eq "Post"
26
+ Impression.last.impressionable_id.should eq 1
27
+ end
19
28
  end
@@ -44,7 +44,6 @@ describe WidgetsController do
44
44
  it "should log unique impressions only once per id" do
45
45
  get "show", :id=> 1
46
46
  Impression.all.size.should eq 12
47
-
48
47
  get "show", :id=> 2
49
48
  Impression.all.size.should eq 13
50
49
 
@@ -57,4 +56,36 @@ describe WidgetsController do
57
56
 
58
57
  end
59
58
 
59
+ context "Impresionist unique params options" do
60
+ it "should log unique impressions at the per action and params level" do
61
+ get "show", :id => 1
62
+ Impression.all.size.should eq 12
63
+ get "show", :id => 2, checked: true
64
+ Impression.all.size.should eq 13
65
+ get "show", :id => 2, checked: false
66
+ Impression.all.size.should eq 14
67
+ get "index"
68
+ Impression.all.size.should eq 15
69
+ end
70
+
71
+ it "should not log impression for same params and same id" do
72
+ get "show", :id => 1
73
+ Impression.all.size.should eq 12
74
+ get "show", :id => 1
75
+ Impression.all.size.should eq 12
76
+ get "show", :id => 1, checked: true
77
+ Impression.all.size.should eq 13
78
+ get "show", :id => 1, checked: false
79
+ Impression.all.size.should eq 14
80
+ get "show", :id => 1, checked: true
81
+ Impression.all.size.should eq 14
82
+ get "show", :id => 1, checked: false
83
+ Impression.all.size.should eq 14
84
+ get "show", :id => 1
85
+ Impression.all.size.should eq 14
86
+ get "show", :id => 2
87
+ Impression.all.size.should eq 15
88
+ end
89
+ end
90
+
60
91
  end
@@ -0,0 +1,4 @@
1
+ one:
2
+ id: 1
3
+ username: test_profile
4
+ slug: test_profile
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Impression do
4
- fixtures :articles,:impressions,:posts
4
+ fixtures :articles,:impressions,:posts,:profiles
5
5
 
6
6
  before(:each) do
7
7
  @article = Article.find(1)
@@ -4,7 +4,7 @@ require 'systemu'
4
4
  # FIXME this test might break the others if run before them
5
5
  # started fixing @nbit001
6
6
  describe Impressionist, :migration do
7
- fixtures :articles,:impressions,:posts
7
+ fixtures :articles,:impressions,:posts,:profiles
8
8
  it "should delete existing migration and generate the migration file" do
9
9
  pending
10
10
  migrations_dir = "#{Rails.root}/db/migrate"
metadata CHANGED
@@ -1,55 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: impressionist
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.1
4
+ version: 1.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - johnmcaliley
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-31 00:00:00.000000000 Z
11
+ date: 2016-09-16 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: httpclient
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ~>
18
- - !ruby/object:Gem::Version
19
- version: '2.2'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ~>
25
- - !ruby/object:Gem::Version
26
- version: '2.2'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: nokogiri
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
- - - ~>
17
+ - - "~>"
32
18
  - !ruby/object:Gem::Version
33
- version: '1.5'
19
+ version: '1.6'
34
20
  type: :runtime
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
38
- - - ~>
24
+ - - "~>"
39
25
  - !ruby/object:Gem::Version
40
- version: '1.5'
26
+ version: '1.6'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: bundler
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
- - - ~>
31
+ - - "~>"
46
32
  - !ruby/object:Gem::Version
47
33
  version: '1.0'
48
34
  type: :development
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
- - - ~>
38
+ - - "~>"
53
39
  - !ruby/object:Gem::Version
54
40
  version: '1.0'
55
41
  description: Log impressions from controller actions or from a model
@@ -58,9 +44,9 @@ executables: []
58
44
  extensions: []
59
45
  extra_rdoc_files: []
60
46
  files:
61
- - .gitignore
62
- - .rspec
63
- - .travis.yml
47
+ - ".gitignore"
48
+ - ".rspec"
49
+ - ".travis.yml"
64
50
  - CHANGELOG.rdoc
65
51
  - Gemfile
66
52
  - LICENSE.txt
@@ -114,6 +100,7 @@ files:
114
100
  - tests/test_app/app/controllers/articles_controller.rb
115
101
  - tests/test_app/app/controllers/dummy_controller.rb
116
102
  - tests/test_app/app/controllers/posts_controller.rb
103
+ - tests/test_app/app/controllers/profiles_controller.rb
117
104
  - tests/test_app/app/controllers/widgets_controller.rb
118
105
  - tests/test_app/app/helpers/application_helper.rb
119
106
  - tests/test_app/app/mailers/.gitkeep
@@ -121,6 +108,7 @@ files:
121
108
  - tests/test_app/app/models/article.rb
122
109
  - tests/test_app/app/models/dummy.rb
123
110
  - tests/test_app/app/models/post.rb
111
+ - tests/test_app/app/models/profile.rb
124
112
  - tests/test_app/app/models/user.rb
125
113
  - tests/test_app/app/models/widget.rb
126
114
  - tests/test_app/app/views/articles/index.html.erb
@@ -130,6 +118,7 @@ files:
130
118
  - tests/test_app/app/views/posts/edit.html.erb
131
119
  - tests/test_app/app/views/posts/index.html.erb
132
120
  - tests/test_app/app/views/posts/show.html.erb
121
+ - tests/test_app/app/views/profiles/show.html.erb
133
122
  - tests/test_app/app/views/widgets/index.html.erb
134
123
  - tests/test_app/app/views/widgets/new.html.erb
135
124
  - tests/test_app/app/views/widgets/show.html.erb
@@ -156,6 +145,8 @@ files:
156
145
  - tests/test_app/db/migrate/20110210205028_create_posts.rb
157
146
  - tests/test_app/db/migrate/20111127184039_create_widgets.rb
158
147
  - tests/test_app/db/migrate/20130719024021_create_impressions_table.rb
148
+ - tests/test_app/db/migrate/20150207135825_create_profiles.rb
149
+ - tests/test_app/db/migrate/20150207140310_create_friendly_id_slugs.rb
159
150
  - tests/test_app/db/schema.rb
160
151
  - tests/test_app/db/seeds.rb
161
152
  - tests/test_app/lib/assets/.gitkeep
@@ -186,6 +177,7 @@ files:
186
177
  - tests/test_app/spec/fixtures/articles.yml
187
178
  - tests/test_app/spec/fixtures/impressions.yml
188
179
  - tests/test_app/spec/fixtures/posts.yml
180
+ - tests/test_app/spec/fixtures/profiles.yml
189
181
  - tests/test_app/spec/fixtures/widgets.yml
190
182
  - tests/test_app/spec/initializers/initializers_spec.rb
191
183
  - tests/test_app/spec/models/bots_spec.rb
@@ -205,17 +197,17 @@ require_paths:
205
197
  - lib
206
198
  required_ruby_version: !ruby/object:Gem::Requirement
207
199
  requirements:
208
- - - '>='
200
+ - - ">="
209
201
  - !ruby/object:Gem::Version
210
202
  version: '0'
211
203
  required_rubygems_version: !ruby/object:Gem::Requirement
212
204
  requirements:
213
- - - '>='
205
+ - - ">="
214
206
  - !ruby/object:Gem::Version
215
207
  version: 1.3.6
216
208
  requirements: []
217
209
  rubyforge_project:
218
- rubygems_version: 2.0.3
210
+ rubygems_version: 2.4.5
219
211
  signing_key:
220
212
  specification_version: 4
221
213
  summary: Easy way to log impressions
@@ -234,6 +226,7 @@ test_files:
234
226
  - tests/test_app/app/controllers/articles_controller.rb
235
227
  - tests/test_app/app/controllers/dummy_controller.rb
236
228
  - tests/test_app/app/controllers/posts_controller.rb
229
+ - tests/test_app/app/controllers/profiles_controller.rb
237
230
  - tests/test_app/app/controllers/widgets_controller.rb
238
231
  - tests/test_app/app/helpers/application_helper.rb
239
232
  - tests/test_app/app/mailers/.gitkeep
@@ -241,6 +234,7 @@ test_files:
241
234
  - tests/test_app/app/models/article.rb
242
235
  - tests/test_app/app/models/dummy.rb
243
236
  - tests/test_app/app/models/post.rb
237
+ - tests/test_app/app/models/profile.rb
244
238
  - tests/test_app/app/models/user.rb
245
239
  - tests/test_app/app/models/widget.rb
246
240
  - tests/test_app/app/views/articles/index.html.erb
@@ -250,6 +244,7 @@ test_files:
250
244
  - tests/test_app/app/views/posts/edit.html.erb
251
245
  - tests/test_app/app/views/posts/index.html.erb
252
246
  - tests/test_app/app/views/posts/show.html.erb
247
+ - tests/test_app/app/views/profiles/show.html.erb
253
248
  - tests/test_app/app/views/widgets/index.html.erb
254
249
  - tests/test_app/app/views/widgets/new.html.erb
255
250
  - tests/test_app/app/views/widgets/show.html.erb
@@ -276,6 +271,8 @@ test_files:
276
271
  - tests/test_app/db/migrate/20110210205028_create_posts.rb
277
272
  - tests/test_app/db/migrate/20111127184039_create_widgets.rb
278
273
  - tests/test_app/db/migrate/20130719024021_create_impressions_table.rb
274
+ - tests/test_app/db/migrate/20150207135825_create_profiles.rb
275
+ - tests/test_app/db/migrate/20150207140310_create_friendly_id_slugs.rb
279
276
  - tests/test_app/db/schema.rb
280
277
  - tests/test_app/db/seeds.rb
281
278
  - tests/test_app/lib/assets/.gitkeep
@@ -306,6 +303,7 @@ test_files:
306
303
  - tests/test_app/spec/fixtures/articles.yml
307
304
  - tests/test_app/spec/fixtures/impressions.yml
308
305
  - tests/test_app/spec/fixtures/posts.yml
306
+ - tests/test_app/spec/fixtures/profiles.yml
309
307
  - tests/test_app/spec/fixtures/widgets.yml
310
308
  - tests/test_app/spec/initializers/initializers_spec.rb
311
309
  - tests/test_app/spec/models/bots_spec.rb
@@ -313,4 +311,3 @@ test_files:
313
311
  - tests/test_app/spec/models/model_spec.rb
314
312
  - tests/test_app/spec/rails_generators/rails_generators_spec.rb
315
313
  - tests/test_app/spec/spec_helper.rb
316
- has_rdoc: