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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bcf311493b6a1b9f107e36c03d07508311bb475401aac8b3a6f2424e57df74a6
4
- data.tar.gz: 3c260211af74b8b8ccba7b474a6300e10224090e1304d3eb3020fbdded28ee31
3
+ metadata.gz: 184d606e77a5294f730b1316417abb87851079957cb99b55e80623ef56f62d08
4
+ data.tar.gz: 4a87cca7f541cfe53db46bd45c26e273451d01fa968178541634aa577f981a7f
5
5
  SHA512:
6
- metadata.gz: 79cc4d5b153f276c0351fe688c2a9f3be13bd2c2a1b350577567d0dfc1e2b9baae090b782eedd2db235f6be4962ed31e9df86635dee1dbf15c164583f1d16857
7
- data.tar.gz: cb19954c1ea4f8a737a73e38c3d3ec84aa14cbcea19547f9e2afa28b2067402faf3ae7c972dd4ef5e7a76eadab86f8c3c83c8cdbab8553433ac2ca3900e521f1
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 "https://rubygems.org"
3
+ source 'https://rubygems.org'
4
4
 
5
5
  # Specify your gem's dependencies in BehaviorLens.gemspec
6
6
  gemspec
7
7
 
8
- gem "rake", "~> 13.0"
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.0)
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
- rake (13.0.6)
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.5.18
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::Analyzer.new
34
- analyzer.track("user_clicked_button")
35
- analyzer.track("user_scrolled_page")
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
@@ -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
- spec.add_dependency 'dependency_name', '~> 1.0'
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
- @clicks = Hash.new(0)
8
+ Database.connect
7
9
  end
8
10
 
9
11
  def track(link)
10
- @clicks[link] += 1
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
- @clicks.max_by { |_, count| count }
19
+ Click.order(count: :desc).first
15
20
  end
16
21
 
22
+ # Generate a report of all clicks
17
23
  def report
18
- @clicks
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
- @events = []
8
+ Database.connect
7
9
  end
8
10
 
9
11
  def track(event_name, metadata = {})
10
- @events << { name: event_name, timestamp: Time.now, metadata: metadata }
12
+ Event.create(
13
+ name: event_name,
14
+ metadata: metadata
15
+ )
11
16
  end
12
17
 
13
18
  def report
14
- @events
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
@@ -0,0 +1,4 @@
1
+ module BehaviorLens
2
+ class Click < ActiveRecord::Base
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module BehaviorLens
2
+ class Event < ActiveRecord::Base
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module BehaviorLens
2
+ class Session < ActiveRecord::Base
3
+ end
4
+ 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: click_tracker.report,
11
- sessions: session_tracker.report,
12
- events: event_tracker.report
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
- CSV.generate do |csv|
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
- @sessions = {}
9
+ Database.connect
7
10
  end
8
11
 
9
12
  def start(user_id)
10
- @sessions[user_id] = { start_time: Time.now, end_time: nil }
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
- return unless @sessions[user_id] && @sessions[user_id][:start_time]
20
+ session = Session.find_by(user_id: user_id, end_time: nil)
21
+ return unless session
15
22
 
16
- @sessions[user_id][:end_time] = Time.now
23
+ session.update(end_time: Time.now)
17
24
  end
18
25
 
19
26
  def report
20
- @sessions
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
- # frozen_string_literal: true
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(event_name, metadata = {})
29
- @event_tracker.track(event_name, metadata)
24
+ def track_event(name, metadata = {})
25
+ @event_tracker.track(name, metadata)
30
26
  end
31
27
 
32
28
  def generate_report(format: :json)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BehaviorLens
4
- VERSION = "0.1.0"
4
+ VERSION = '0.1.1'
5
5
  end
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.0
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-23 00:00:00.000000000 Z
11
+ date: 2024-12-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: dependency_name
14
+ name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.0'
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: '1.0'
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