impressiongram 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,68 @@
1
+ module Impressionist
2
+ module Impressionable
3
+ def is_impressionable
4
+ has_many :impressions, :as=>:impressionable
5
+ include InstanceMethods
6
+ end
7
+
8
+ module InstanceMethods
9
+ def impressionable?
10
+ true
11
+ end
12
+
13
+ def impressionist_count(options={})
14
+ options.reverse_merge!(:filter=>:request_hash, :start_date=>nil, :end_date=>Time.now)
15
+ imps = options[:start_date].blank? ? impressions : impressions.where("created_at>=? and created_at<=?",options[:start_date],options[:end_date])
16
+ if options[:filter]!=:all
17
+ imps = imps.select(options[:filter]).group(options[:filter])
18
+ end
19
+ imps.all.size
20
+ end
21
+
22
+ def impression_gram(millisecond=false, time_format="seconds", graph_label="", minute_increments, hours_covered, hour_offset)
23
+ time_formatter = case time_format
24
+ when "seconds" then "%s"
25
+ when "hour/minute" then "%h:%M %p"
26
+ end
27
+ def key_formatter(millisecond, time_formatter, minute_increments)
28
+ key = minute_increments.minutes.ago.strftime(time_formatter).to_i
29
+ if millisecond
30
+ key = key*1000
31
+ end
32
+ return key
33
+ end
34
+ hits_label = {:label => graph_label}
35
+ hits_by_interval = []
36
+ minute = 0 + offset*60
37
+ while minute < (offset+60*hours_covered)
38
+ if minute == offset*60
39
+ hits_by_interval << [ key_formatter(millisecond, time_formatter, minute_increments), impressions.where("created_at >= ?", minute_increments.minutes.ago).count]
40
+ else
41
+ hits_by_interval << [ key_formatter(millisecond, time_formatter, (minute_increments+minute)).minute.ago.strftime("%s").to_i*1000, impressions.where("created_at >= ?", (minute_increments+minute).minutes.ago).where("created_at <= ?", minute.minutes.ago).count ]
42
+ end
43
+ minute += minute_increments
44
+ end
45
+ hits_hash = {:data => hits_by_hour}
46
+ return hits_label.merge!(hits_hash)
47
+ end
48
+
49
+
50
+ # OLD METHODS - DEPRECATE IN V0.5
51
+ def impression_count(start_date=nil,end_date=Time.now)
52
+ impressionist_count({:start_date=>start_date, :end_date=>end_date, :filter=>:all})
53
+ end
54
+
55
+ def unique_impression_count(start_date=nil,end_date=Time.now)
56
+ impressionist_count({:start_date=>start_date, :end_date=>end_date, :filter=> :request_hash})
57
+ end
58
+
59
+ def unique_impression_count_ip(start_date=nil,end_date=Time.now)
60
+ impressionist_count({:start_date=>start_date, :end_date=>end_date, :filter=> :ip_address})
61
+ end
62
+
63
+ def unique_impression_count_session(start_date=nil,end_date=Time.now)
64
+ impressionist_count({:start_date=>start_date, :end_date=>end_date, :filter=> :session_hash})
65
+ end
66
+ end
67
+ end
68
+ end
data/config/routes.rb ADDED
@@ -0,0 +1,2 @@
1
+ Rails.application.routes.draw do
2
+ end
@@ -0,0 +1,20 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/migration'
3
+
4
+ class ImpressionistGenerator < Rails::Generators::Base
5
+ include Rails::Generators::Migration
6
+ source_root File.join(File.dirname(__FILE__), 'templates')
7
+
8
+ def self.next_migration_number(dirname)
9
+ sleep 1
10
+ if ActiveRecord::Base.timestamped_migrations
11
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
12
+ else
13
+ "%.3d" % (current_migration_number(dirname) + 1)
14
+ end
15
+ end
16
+
17
+ def create_migration_file
18
+ migration_template 'create_impressions_table.rb', 'db/migrate/create_impressions_table.rb'
19
+ end
20
+ end
@@ -0,0 +1,37 @@
1
+ class CreateImpressionsTable < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :impressions, :force => true do |t|
4
+ t.string :impressionable_type
5
+ t.integer :impressionable_id
6
+ t.integer :user_id
7
+ t.string :controller_name
8
+ t.string :action_name
9
+ t.string :view_name
10
+ t.string :request_hash
11
+ t.string :session_hash
12
+ t.string :ip_address
13
+ t.string :message
14
+ t.string :referrer
15
+ t.timestamps
16
+ end
17
+ add_index :impressions, [:impressionable_type, :impressionable_id, :request_hash], :name => "poly_request_index", :unique => false
18
+ add_index :impressions, [:impressionable_type, :impressionable_id, :ip_address], :name => "poly_ip_index", :unique => false
19
+ add_index :impressions, [:impressionable_type, :impressionable_id, :session_hash], :name => "poly_session_index", :unique => false
20
+ add_index :impressions, [:controller_name,:action_name,:request_hash], :name => "controlleraction_request_index", :unique => false
21
+ add_index :impressions, [:controller_name,:action_name,:ip_address], :name => "controlleraction_ip_index", :unique => false
22
+ add_index :impressions, [:controller_name,:action_name,:session_hash], :name => "controlleraction_session_index", :unique => false
23
+ add_index :impressions, :user_id
24
+ end
25
+
26
+ def self.down
27
+ remove_index :impressions, :name => :poly_request_index
28
+ remove_index :impressions, :name => :poly_ip_index
29
+ remove_index :impressions, :name => :poly_session_index
30
+ remove_index :impressions, :name => :controlleraction_request_index
31
+ remove_index :impressions, :name => :controlleraction_ip_index
32
+ remove_index :impressions, :name => :controlleraction_session_index
33
+ remove_index :impressions, :user_id
34
+
35
+ drop_table :impressions
36
+ end
37
+ end
@@ -0,0 +1,5 @@
1
+ IMPRESSIONIST_PATH = File.dirname(__FILE__) + "/impressionist"
2
+ require "#{IMPRESSIONIST_PATH}/engine.rb"
3
+
4
+ module Impressionist
5
+ end
@@ -0,0 +1,18 @@
1
+ require 'httpclient'
2
+ require 'nokogiri'
3
+
4
+ module Impressionist
5
+ module Bots
6
+ LIST_URL = "http://www.user-agents.org/allagents.xml"
7
+ 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
14
+ end
15
+ list
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ require "impressionist"
2
+ require "rails"
3
+
4
+ module Impressionist
5
+ class Engine < Rails::Engine
6
+ initializer 'impressionist.extend_ar' do |app|
7
+ ActiveRecord::Base.extend Impressionist::Impressionable
8
+ end
9
+
10
+ initializer 'impressionist.controller' do
11
+ ActiveSupport.on_load(:action_controller) do
12
+ include ImpressionistController::InstanceMethods
13
+ extend ImpressionistController::ClassMethods
14
+ end
15
+ end
16
+ end
17
+ end
File without changes
data/logo.png ADDED
Binary file
@@ -0,0 +1,27 @@
1
+ class CreateImpressionsTable < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :impressions, :session_hash, :string
4
+ remove_index :impressions, :name => :poly_index
5
+ remove_index :impressions, :name => :controlleraction_index
6
+ add_index :impressions, [:impressionable_type, :impressionable_id, :request_hash], :name => "poly_request_index", :unique => false
7
+ add_index :impressions, [:impressionable_type, :impressionable_id, :ip_address], :name => "poly_ip_index", :unique => false
8
+ add_index :impressions, [:impressionable_type, :impressionable_id, :session_hash], :name => "poly_session_index", :unique => false
9
+ add_index :impressions, [:controller_name,:action_name,:request_hash], :name => "controlleraction_request_index", :unique => false
10
+ add_index :impressions, [:controller_name,:action_name,:ip_address], :name => "controlleraction_ip_index", :unique => false
11
+ add_index :impressions, [:controller_name,:action_name,:session_hash], :name => "controlleraction_session_index", :unique => false
12
+
13
+ end
14
+
15
+ def self.down
16
+ remove_column :impressions, :session_hash
17
+ remove_index :impressions, :name => :poly_request_index
18
+ remove_index :impressions, :name => :poly_ip_index
19
+ remove_index :impressions, :name => :poly_session_index
20
+ remove_index :impressions, :name => :controlleraction_request_index
21
+ remove_index :impressions, :name => :controlleraction_ip_index
22
+ remove_index :impressions, :name => :controlleraction_session_index
23
+ remove_index :impressions, :user_id
24
+ add_index :impressions, [:impressionable_type, :impressionable_id, :request_hash, :ip_address], :name => "poly_index", :unique => false
25
+ add_index :impressions, [:controller_name,:action_name,:request_hash,:ip_address], :name => "controlleraction_index", :unique => false
26
+ end
27
+ end
@@ -0,0 +1,9 @@
1
+ class Version04UpdateImpressionsTable < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :impressions, :referrer, :string
4
+ end
5
+
6
+ def self.down
7
+ remove_column :impressions, :referrer
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,139 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: impressiongram
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.0
6
+ platform: ruby
7
+ authors:
8
+ - paulkaplan
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-08-03 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: shoulda
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ type: :development
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
+ name: bundler
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: 1.0.0
35
+ type: :development
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
38
+ name: jeweler
39
+ prerelease: false
40
+ requirement: &id003 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 1.5.1
46
+ type: :development
47
+ version_requirements: *id003
48
+ - !ruby/object:Gem::Dependency
49
+ name: rcov
50
+ prerelease: false
51
+ requirement: &id004 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
57
+ type: :development
58
+ version_requirements: *id004
59
+ - !ruby/object:Gem::Dependency
60
+ name: httpclient
61
+ prerelease: false
62
+ requirement: &id005 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
68
+ type: :development
69
+ version_requirements: *id005
70
+ - !ruby/object:Gem::Dependency
71
+ name: nokogiri
72
+ prerelease: false
73
+ requirement: &id006 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: "0"
79
+ type: :development
80
+ version_requirements: *id006
81
+ description: Fork of original charlotte-ruby impressionist gem, with added histogram functionality
82
+ email: paul.kaplan.74@gmail.com
83
+ executables: []
84
+
85
+ extensions: []
86
+
87
+ extra_rdoc_files:
88
+ - LICENSE.txt
89
+ - README.md
90
+ files:
91
+ - CHANGELOG.rdoc
92
+ - Gemfile
93
+ - LICENSE.txt
94
+ - README.md
95
+ - Rakefile
96
+ - VERSION
97
+ - app/controllers/impressionist_controller.rb
98
+ - app/models/impression.rb
99
+ - app/models/impressionist/bots.rb
100
+ - app/models/impressionist/impressionable.rb
101
+ - config/routes.rb
102
+ - lib/generators/impressionist/impressionist_generator.rb
103
+ - lib/generators/impressionist/templates/create_impressions_table.rb
104
+ - lib/impressionist.rb
105
+ - lib/impressionist/bots.rb
106
+ - lib/impressionist/engine.rb
107
+ - lib/impressionist/railties/tasks.rake
108
+ - logo.png
109
+ - upgrade_migrations/version_0_3_0.rb
110
+ - upgrade_migrations/version_0_4_0.rb
111
+ homepage: http://github.com/paulkaplan/impressionist
112
+ licenses:
113
+ - MIT
114
+ post_install_message:
115
+ rdoc_options: []
116
+
117
+ require_paths:
118
+ - lib
119
+ required_ruby_version: !ruby/object:Gem::Requirement
120
+ none: false
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: "0"
125
+ required_rubygems_version: !ruby/object:Gem::Requirement
126
+ none: false
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: "0"
131
+ requirements: []
132
+
133
+ rubyforge_project:
134
+ rubygems_version: 1.8.6
135
+ signing_key:
136
+ specification_version: 3
137
+ summary: Easy way to log impressions (and histogram the results)
138
+ test_files: []
139
+