behavior_lens 0.1.0 → 0.1.1
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.
- checksums.yaml +4 -4
- data/Gemfile +5 -2
- data/Gemfile.lock +57 -4
- data/README.md +28 -3
- data/behavior_lens.gemspec +5 -1
- data/lib/behavior_lens/click_tracker.rb +10 -4
- data/lib/behavior_lens/database.rb +49 -0
- data/lib/behavior_lens/event_tracker.rb +14 -3
- data/lib/behavior_lens/models/click.rb +4 -0
- data/lib/behavior_lens/models/event.rb +4 -0
- data/lib/behavior_lens/models/session.rb +4 -0
- data/lib/behavior_lens/report_generator.rb +34 -21
- data/lib/behavior_lens/session_tracker.rb +18 -5
- data/lib/behavior_lens/tracker.rb +5 -9
- data/lib/behavior_lens/version.rb +1 -1
- metadata +29 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 184d606e77a5294f730b1316417abb87851079957cb99b55e80623ef56f62d08
|
4
|
+
data.tar.gz: 4a87cca7f541cfe53db46bd45c26e273451d01fa968178541634aa577f981a7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f252f925490cc217291bb6ed09739faee959bb44e35c3d07d524d14a02265da27f4c07aac1b90d46f882a14adf440f4cca22617b6c48fe45b17acffcd66797e9
|
7
|
+
data.tar.gz: 3194cf55a295b0e9c10731675d6b4837136eee0f84c3781b272dd2eb3421b0aa761811517064c10beaa4c23663714d9076ef9d028540e52e046ba8a7262af5e1
|
data/Gemfile
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
source
|
3
|
+
source 'https://rubygems.org'
|
4
4
|
|
5
5
|
# Specify your gem's dependencies in BehaviorLens.gemspec
|
6
6
|
gemspec
|
7
7
|
|
8
|
-
gem
|
8
|
+
gem 'activerecord', '~> 7.2', '>= 7.2.2.1'
|
9
|
+
gem 'byebug'
|
10
|
+
gem 'mysql2'
|
11
|
+
gem 'rake', '~> 13.0'
|
data/Gemfile.lock
CHANGED
@@ -1,20 +1,73 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
behavior_lens (0.1.
|
4
|
+
behavior_lens (0.1.1)
|
5
|
+
activerecord (~> 7.2, >= 7.2.2.1)
|
6
|
+
mysql2
|
5
7
|
|
6
8
|
GEM
|
7
9
|
remote: https://rubygems.org/
|
8
10
|
specs:
|
9
|
-
|
11
|
+
activemodel (7.2.2.1)
|
12
|
+
activesupport (= 7.2.2.1)
|
13
|
+
activerecord (7.2.2.1)
|
14
|
+
activemodel (= 7.2.2.1)
|
15
|
+
activesupport (= 7.2.2.1)
|
16
|
+
timeout (>= 0.4.0)
|
17
|
+
activesupport (7.2.2.1)
|
18
|
+
base64
|
19
|
+
benchmark (>= 0.3)
|
20
|
+
bigdecimal
|
21
|
+
concurrent-ruby (~> 1.0, >= 1.3.1)
|
22
|
+
connection_pool (>= 2.2.5)
|
23
|
+
drb
|
24
|
+
i18n (>= 1.6, < 2)
|
25
|
+
logger (>= 1.4.2)
|
26
|
+
minitest (>= 5.1)
|
27
|
+
securerandom (>= 0.3)
|
28
|
+
tzinfo (~> 2.0, >= 2.0.5)
|
29
|
+
base64 (0.2.0)
|
30
|
+
benchmark (0.4.0)
|
31
|
+
bigdecimal (3.1.9)
|
32
|
+
byebug (11.1.3)
|
33
|
+
concurrent-ruby (1.3.4)
|
34
|
+
connection_pool (2.4.1)
|
35
|
+
diff-lcs (1.5.1)
|
36
|
+
drb (2.2.1)
|
37
|
+
i18n (1.14.6)
|
38
|
+
concurrent-ruby (~> 1.0)
|
39
|
+
logger (1.6.4)
|
40
|
+
minitest (5.25.4)
|
41
|
+
mysql2 (0.5.6)
|
42
|
+
rake (13.2.1)
|
43
|
+
rspec (3.13.0)
|
44
|
+
rspec-core (~> 3.13.0)
|
45
|
+
rspec-expectations (~> 3.13.0)
|
46
|
+
rspec-mocks (~> 3.13.0)
|
47
|
+
rspec-core (3.13.2)
|
48
|
+
rspec-support (~> 3.13.0)
|
49
|
+
rspec-expectations (3.13.3)
|
50
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
51
|
+
rspec-support (~> 3.13.0)
|
52
|
+
rspec-mocks (3.13.2)
|
53
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
54
|
+
rspec-support (~> 3.13.0)
|
55
|
+
rspec-support (3.13.2)
|
56
|
+
securerandom (0.4.1)
|
57
|
+
timeout (0.4.3)
|
58
|
+
tzinfo (2.0.6)
|
59
|
+
concurrent-ruby (~> 1.0)
|
10
60
|
|
11
61
|
PLATFORMS
|
12
62
|
ruby
|
13
|
-
x86_64-linux
|
14
63
|
|
15
64
|
DEPENDENCIES
|
65
|
+
activerecord (~> 7.2, >= 7.2.2.1)
|
16
66
|
behavior_lens!
|
67
|
+
byebug
|
68
|
+
mysql2
|
17
69
|
rake (~> 13.0)
|
70
|
+
rspec (~> 3.0)
|
18
71
|
|
19
72
|
BUNDLED WITH
|
20
|
-
2.
|
73
|
+
2.1.4
|
data/README.md
CHANGED
@@ -22,6 +22,31 @@ Or install it yourself as:
|
|
22
22
|
gem install behavior_lens
|
23
23
|
```
|
24
24
|
|
25
|
+
## Database Setup
|
26
|
+
|
27
|
+
BehaviorLens requires a MySQL database to store tracked data.
|
28
|
+
|
29
|
+
### 1. Create a Database
|
30
|
+
```sql
|
31
|
+
CREATE DATABASE behavior_lens;
|
32
|
+
```
|
33
|
+
|
34
|
+
### 2. Connect to database
|
35
|
+
```ruby
|
36
|
+
require 'behavior_lens'
|
37
|
+
|
38
|
+
BehaviorLens::Database.connect(
|
39
|
+
database: 'your_database_name',
|
40
|
+
username: 'your_username',
|
41
|
+
password: 'your_password',
|
42
|
+
host: 'your_host' # Usually 'localhost'
|
43
|
+
)
|
44
|
+
```
|
45
|
+
### 3. Initialize the Database Schema
|
46
|
+
```ruby
|
47
|
+
BehaviorLens::Database.setup
|
48
|
+
```
|
49
|
+
|
25
50
|
## Usage
|
26
51
|
|
27
52
|
To use BehaviorLens in your project, require the gem and start analyzing behavior patterns. Here's a quick example:
|
@@ -30,9 +55,9 @@ To use BehaviorLens in your project, require the gem and start analyzing behavio
|
|
30
55
|
require 'behavior_lens'
|
31
56
|
|
32
57
|
# Example: Analyzing a set of user actions
|
33
|
-
analyzer = BehaviorLens::
|
34
|
-
analyzer.
|
35
|
-
analyzer.
|
58
|
+
analyzer = BehaviorLens::Tracker.new
|
59
|
+
analyzer.track_event("user_clicked_button", {name: 'btn1'})
|
60
|
+
analyzer.track_click("https://example.com")
|
36
61
|
|
37
62
|
report = analyzer.generate_report
|
38
63
|
puts report
|
data/behavior_lens.gemspec
CHANGED
@@ -24,7 +24,11 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.metadata['changelog_uri'] = 'https://github.com/aayush502/behaviour_lens/blob/master/CHANGELOG.md'
|
25
25
|
|
26
26
|
spec.post_install_message = 'Thank you for installing BehaviorLens! Check out https://github.com/aayush502/behaviour_lens for usage instructions.'
|
27
|
-
|
27
|
+
# behavior_lens.gemspec
|
28
|
+
spec.add_dependency 'activerecord', '~> 7.2', '>= 7.2.2.1'
|
29
|
+
# behavior_lens.gemspec
|
30
|
+
spec.add_dependency 'mysql2'
|
31
|
+
|
28
32
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
29
33
|
|
30
34
|
# Specify which files should be added to the gem when it is released.
|
@@ -1,21 +1,27 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative '../behavior_lens/models/click'
|
4
|
+
|
3
5
|
module BehaviorLens
|
4
6
|
class ClickTracker
|
5
7
|
def initialize
|
6
|
-
|
8
|
+
Database.connect
|
7
9
|
end
|
8
10
|
|
9
11
|
def track(link)
|
10
|
-
|
12
|
+
click = Click.find_or_initialize_by(link: link)
|
13
|
+
click.count += 1
|
14
|
+
click.save
|
11
15
|
end
|
12
16
|
|
17
|
+
# Retrieve the most clicked link
|
13
18
|
def most_clicked
|
14
|
-
|
19
|
+
Click.order(count: :desc).first
|
15
20
|
end
|
16
21
|
|
22
|
+
# Generate a report of all clicks
|
17
23
|
def report
|
18
|
-
|
24
|
+
Click.all.map { |click| { link: click.link, count: click.count } }
|
19
25
|
end
|
20
26
|
end
|
21
27
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
|
3
|
+
module BehaviorLens
|
4
|
+
class Database
|
5
|
+
def self.connect(database, username, password, host)
|
6
|
+
ActiveRecord::Base.establish_connection(
|
7
|
+
adapter: 'mysql2',
|
8
|
+
host: host,
|
9
|
+
database: database,
|
10
|
+
username: username,
|
11
|
+
password: password
|
12
|
+
)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.setup
|
16
|
+
ActiveRecord::Schema.define do
|
17
|
+
connection = ActiveRecord::Base.connection
|
18
|
+
|
19
|
+
# Check and create 'clicks' table
|
20
|
+
unless connection.data_source_exists?('clicks')
|
21
|
+
create_table :clicks do |t|
|
22
|
+
t.string :link, null: false
|
23
|
+
t.integer :count, default: 1
|
24
|
+
t.timestamps
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Check and create 'sessions' table
|
29
|
+
unless connection.data_source_exists?('sessions')
|
30
|
+
create_table :sessions do |t|
|
31
|
+
t.string :user_id, null: false
|
32
|
+
t.datetime :start_time
|
33
|
+
t.datetime :end_time
|
34
|
+
t.timestamps
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Check and create 'events' table
|
39
|
+
unless connection.data_source_exists?('events')
|
40
|
+
create_table :events do |t|
|
41
|
+
t.string :name, null: false
|
42
|
+
t.json :metadata # JSON is fully supported in MySQL with ActiveRecord 7+
|
43
|
+
t.timestamps
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -1,17 +1,28 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative '../behavior_lens/models/event'
|
4
|
+
|
3
5
|
module BehaviorLens
|
4
6
|
class EventTracker
|
5
7
|
def initialize
|
6
|
-
|
8
|
+
Database.connect
|
7
9
|
end
|
8
10
|
|
9
11
|
def track(event_name, metadata = {})
|
10
|
-
|
12
|
+
Event.create(
|
13
|
+
name: event_name,
|
14
|
+
metadata: metadata
|
15
|
+
)
|
11
16
|
end
|
12
17
|
|
13
18
|
def report
|
14
|
-
|
19
|
+
Event.all.map do |event|
|
20
|
+
{
|
21
|
+
name: event.name,
|
22
|
+
timestamp: event.created_at,
|
23
|
+
metadata: event.metadata
|
24
|
+
}
|
25
|
+
end
|
15
26
|
end
|
16
27
|
end
|
17
28
|
end
|
@@ -6,37 +6,50 @@ require 'csv'
|
|
6
6
|
module BehaviorLens
|
7
7
|
class ReportGenerator
|
8
8
|
def self.generate(click_tracker, session_tracker, event_tracker, format)
|
9
|
+
# Fetch data from the trackers
|
10
|
+
clicks = click_tracker.report
|
11
|
+
sessions = session_tracker.report
|
12
|
+
events = event_tracker.report
|
13
|
+
|
9
14
|
data = {
|
10
|
-
clicks:
|
11
|
-
sessions:
|
12
|
-
|
15
|
+
clicks: clicks.map { |click| { link: click[:link], count: click[:count] } },
|
16
|
+
sessions: sessions.map do |session|
|
17
|
+
{ user_id: session[:user_id], start_time: session[:start_time], end_time: session[:end_time] }
|
18
|
+
end,
|
19
|
+
events: events.map { |event| { name: event[:name], metadata: event[:metadata], timestamp: event[:timestamp] } }
|
13
20
|
}
|
14
21
|
|
15
22
|
case format
|
16
23
|
when :json
|
17
24
|
JSON.pretty_generate(data)
|
18
25
|
when :csv
|
19
|
-
|
20
|
-
csv << %w[Category Item Value]
|
21
|
-
|
22
|
-
# Format clicks
|
23
|
-
data[:clicks].each do |url, count|
|
24
|
-
csv << ['Click', url, count]
|
25
|
-
end
|
26
|
-
|
27
|
-
# Format sessions
|
28
|
-
data[:sessions].each do |user_id, session|
|
29
|
-
csv << ['Session', user_id, "Start: #{session[:start_time]}, End: #{session[:end_time]}"]
|
30
|
-
end
|
31
|
-
|
32
|
-
# Format events
|
33
|
-
data[:events].each do |event|
|
34
|
-
csv << ['Event', event[:name], event[:metadata].to_json]
|
35
|
-
end
|
36
|
-
end
|
26
|
+
generate_csv(data)
|
37
27
|
else
|
38
28
|
data.to_s
|
39
29
|
end
|
40
30
|
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def generate_csv(data)
|
35
|
+
CSV.generate do |csv|
|
36
|
+
csv << %w[Category Item Details]
|
37
|
+
|
38
|
+
# Add click data
|
39
|
+
data[:clicks].each do |click|
|
40
|
+
csv << ['Click', click[:link], "Count: #{click[:count]}"]
|
41
|
+
end
|
42
|
+
|
43
|
+
# Add session data
|
44
|
+
data[:sessions].each do |session|
|
45
|
+
csv << ['Session', session[:user_id], "Start: #{session[:start_time]}, End: #{session[:end_time]}"]
|
46
|
+
end
|
47
|
+
|
48
|
+
# Add event data
|
49
|
+
data[:events].each do |event|
|
50
|
+
csv << ['Event', event[:name], event[:metadata].to_json]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
41
54
|
end
|
42
55
|
end
|
@@ -1,23 +1,36 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'byebug'
|
4
|
+
require_relative '../behavior_lens/models/session'
|
5
|
+
|
3
6
|
module BehaviorLens
|
4
7
|
class SessionTracker
|
5
8
|
def initialize
|
6
|
-
|
9
|
+
Database.connect
|
7
10
|
end
|
8
11
|
|
9
12
|
def start(user_id)
|
10
|
-
|
13
|
+
Session.create(
|
14
|
+
user_id: user_id,
|
15
|
+
start_time: Time.now
|
16
|
+
)
|
11
17
|
end
|
12
18
|
|
13
19
|
def end(user_id)
|
14
|
-
|
20
|
+
session = Session.find_by(user_id: user_id, end_time: nil)
|
21
|
+
return unless session
|
15
22
|
|
16
|
-
|
23
|
+
session.update(end_time: Time.now)
|
17
24
|
end
|
18
25
|
|
19
26
|
def report
|
20
|
-
|
27
|
+
Session.all.map do |session|
|
28
|
+
{
|
29
|
+
user_id: session.user_id,
|
30
|
+
start_time: session.start_time,
|
31
|
+
end_time: session.end_time
|
32
|
+
}
|
33
|
+
end
|
21
34
|
end
|
22
35
|
end
|
23
36
|
end
|
@@ -1,18 +1,14 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require_relative 'database'
|
3
2
|
module BehaviorLens
|
4
3
|
class Tracker
|
5
4
|
def initialize
|
5
|
+
Database.connect
|
6
|
+
Database.setup
|
6
7
|
@click_tracker = ClickTracker.new
|
7
8
|
@session_tracker = SessionTracker.new
|
8
9
|
@event_tracker = EventTracker.new
|
9
10
|
end
|
10
11
|
|
11
|
-
# Delegates most_clicked to ClickTracker
|
12
|
-
def most_clicked
|
13
|
-
@click_tracker.most_clicked
|
14
|
-
end
|
15
|
-
|
16
12
|
def track_click(link)
|
17
13
|
@click_tracker.track(link)
|
18
14
|
end
|
@@ -25,8 +21,8 @@ module BehaviorLens
|
|
25
21
|
@session_tracker.end(user_id)
|
26
22
|
end
|
27
23
|
|
28
|
-
def track_event(
|
29
|
-
@event_tracker.track(
|
24
|
+
def track_event(name, metadata = {})
|
25
|
+
@event_tracker.track(name, metadata)
|
30
26
|
end
|
31
27
|
|
32
28
|
def generate_report(format: :json)
|
metadata
CHANGED
@@ -1,29 +1,49 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: behavior_lens
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aayush Humagain
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-12-
|
11
|
+
date: 2024-12-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: activerecord
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '7.2'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 7.2.2.1
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
27
|
- - "~>"
|
25
28
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
29
|
+
version: '7.2'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 7.2.2.1
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: mysql2
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
27
47
|
- !ruby/object:Gem::Dependency
|
28
48
|
name: rspec
|
29
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -61,7 +81,11 @@ files:
|
|
61
81
|
- bin/setup
|
62
82
|
- lib/behavior_lens.rb
|
63
83
|
- lib/behavior_lens/click_tracker.rb
|
84
|
+
- lib/behavior_lens/database.rb
|
64
85
|
- lib/behavior_lens/event_tracker.rb
|
86
|
+
- lib/behavior_lens/models/click.rb
|
87
|
+
- lib/behavior_lens/models/event.rb
|
88
|
+
- lib/behavior_lens/models/session.rb
|
65
89
|
- lib/behavior_lens/report_generator.rb
|
66
90
|
- lib/behavior_lens/session_tracker.rb
|
67
91
|
- lib/behavior_lens/tracker.rb
|