impressiongram 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
+