ahoy_analytics 0.1.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.
Files changed (198) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +163 -0
  4. data/Rakefile +6 -0
  5. data/app/assets/ahoy_analytics/build/assets/Combination-BpSXUjp9.js +41 -0
  6. data/app/assets/ahoy_analytics/build/assets/analytics-5KyfCxh6.css +1 -0
  7. data/app/assets/ahoy_analytics/build/assets/analytics-dashboard-uOXx8zYZ.js +1 -0
  8. data/app/assets/ahoy_analytics/build/assets/analytics-layout-ClAft5OU.js +1 -0
  9. data/app/assets/ahoy_analytics/build/assets/analytics-tracker-B3f8P98z.js +1 -0
  10. data/app/assets/ahoy_analytics/build/assets/analytics-ui-DMSkNqd6.js +90 -0
  11. data/app/assets/ahoy_analytics/build/assets/behaviors-panel-ChNGYbdH.js +1 -0
  12. data/app/assets/ahoy_analytics/build/assets/button-JVCrlR4s.js +1 -0
  13. data/app/assets/ahoy_analytics/build/assets/cable-DO-7y1-E.js +1 -0
  14. data/app/assets/ahoy_analytics/build/assets/createLucideIcon-BGzacY2v.js +1 -0
  15. data/app/assets/ahoy_analytics/build/assets/date-range-dialog-DWDp3cLG.js +1 -0
  16. data/app/assets/ahoy_analytics/build/assets/details-button-NqKfSGEG.js +1 -0
  17. data/app/assets/ahoy_analytics/build/assets/devices-panel-cXvlmNBY.js +1 -0
  18. data/app/assets/ahoy_analytics/build/assets/dialog-path-BBPNlB4Z.js +1 -0
  19. data/app/assets/ahoy_analytics/build/assets/dropdown-menu-Adj3O5fh.js +1 -0
  20. data/app/assets/ahoy_analytics/build/assets/filter-dialog-BN-rf4lp.js +1 -0
  21. data/app/assets/ahoy_analytics/build/assets/index-B1K1NTKT.js +3 -0
  22. data/app/assets/ahoy_analytics/build/assets/index-BcHeb-Rh.js +1 -0
  23. data/app/assets/ahoy_analytics/build/assets/index-DzpzLoG4.js +1 -0
  24. data/app/assets/ahoy_analytics/build/assets/index-vX97OY1J.js +1 -0
  25. data/app/assets/ahoy_analytics/build/assets/input-e4v_v0kE.js +1 -0
  26. data/app/assets/ahoy_analytics/build/assets/jsx-runtime-u17CrQMm.js +1 -0
  27. data/app/assets/ahoy_analytics/build/assets/last-load-context-De5uA95L.js +1 -0
  28. data/app/assets/ahoy_analytics/build/assets/list-table-ChHEzzF9.js +1 -0
  29. data/app/assets/ahoy_analytics/build/assets/live-Cp2MHECh.js +2 -0
  30. data/app/assets/ahoy_analytics/build/assets/locations-panel-BaISRmaQ.js +1 -0
  31. data/app/assets/ahoy_analytics/build/assets/mercator-BnxX5RzL.js +1 -0
  32. data/app/assets/ahoy_analytics/build/assets/pages-panel-Bh25L8mP.js +1 -0
  33. data/app/assets/ahoy_analytics/build/assets/panel-tabs-B2kvGFJx.js +1 -0
  34. data/app/assets/ahoy_analytics/build/assets/query-context-B-PgE00D.js +1 -0
  35. data/app/assets/ahoy_analytics/build/assets/remote-details-dialog-DDTcKaM5.js +1 -0
  36. data/app/assets/ahoy_analytics/build/assets/show-CCRicksg.js +1 -0
  37. data/app/assets/ahoy_analytics/build/assets/simple-tabs-D6G6Bs0k.js +1 -0
  38. data/app/assets/ahoy_analytics/build/assets/site-context-BNteYRlR.js +1 -0
  39. data/app/assets/ahoy_analytics/build/assets/sources-panel-DyB21hxD.js +1 -0
  40. data/app/assets/ahoy_analytics/build/assets/top-bar-FSiLBjq6.js +1 -0
  41. data/app/assets/ahoy_analytics/build/assets/top-stats-context-DU15P9jS.js +1 -0
  42. data/app/assets/ahoy_analytics/build/assets/use-debounce-VBpXQRL8.js +1 -0
  43. data/app/assets/ahoy_analytics/build/assets/user-context-DbYteluY.js +1 -0
  44. data/app/assets/ahoy_analytics/build/assets/visitor-globe-BWLDihid.js +4789 -0
  45. data/app/assets/ahoy_analytics/build/assets/visitor-graph-uKXjLvcu.js +1 -0
  46. data/app/assets/ahoy_analytics/images/icon/browser/brave.svg +1 -0
  47. data/app/assets/ahoy_analytics/images/icon/browser/chrome.svg +1 -0
  48. data/app/assets/ahoy_analytics/images/icon/browser/chromium.svg +1 -0
  49. data/app/assets/ahoy_analytics/images/icon/browser/duckduckgo.svg +2151 -0
  50. data/app/assets/ahoy_analytics/images/icon/browser/edge.svg +1 -0
  51. data/app/assets/ahoy_analytics/images/icon/browser/fallback.svg +5 -0
  52. data/app/assets/ahoy_analytics/images/icon/browser/firefox.svg +1 -0
  53. data/app/assets/ahoy_analytics/images/icon/browser/opera.svg +1 -0
  54. data/app/assets/ahoy_analytics/images/icon/browser/safari.png +0 -0
  55. data/app/assets/ahoy_analytics/images/icon/browser/samsung-internet.svg +1 -0
  56. data/app/assets/ahoy_analytics/images/icon/browser/uc.svg +1 -0
  57. data/app/assets/ahoy_analytics/images/icon/browser/vivaldi.svg +1 -0
  58. data/app/assets/ahoy_analytics/images/icon/browser/yandex.png +0 -0
  59. data/app/assets/ahoy_analytics/images/icon/os/android.png +0 -0
  60. data/app/assets/ahoy_analytics/images/icon/os/chrome_os.png +0 -0
  61. data/app/assets/ahoy_analytics/images/icon/os/fallback.svg +5 -0
  62. data/app/assets/ahoy_analytics/images/icon/os/fedora.png +0 -0
  63. data/app/assets/ahoy_analytics/images/icon/os/freebsd.png +0 -0
  64. data/app/assets/ahoy_analytics/images/icon/os/gnu_linux.png +0 -0
  65. data/app/assets/ahoy_analytics/images/icon/os/ios.png +0 -0
  66. data/app/assets/ahoy_analytics/images/icon/os/ipad_os.png +0 -0
  67. data/app/assets/ahoy_analytics/images/icon/os/mac.png +0 -0
  68. data/app/assets/ahoy_analytics/images/icon/os/ubuntu.png +0 -0
  69. data/app/assets/ahoy_analytics/images/icon/os/windows.png +0 -0
  70. data/app/assets/stylesheets/ahoy_analytics/application.css +15 -0
  71. data/app/channels/ahoy_analytics/analytics_channel.rb +9 -0
  72. data/app/controllers/ahoy_analytics/analytics_controller.rb +9 -0
  73. data/app/controllers/ahoy_analytics/application_controller.rb +8 -0
  74. data/app/controllers/ahoy_analytics/assets_controller.rb +46 -0
  75. data/app/controllers/ahoy_analytics/base_controller.rb +285 -0
  76. data/app/controllers/ahoy_analytics/behaviors_controller.rb +14 -0
  77. data/app/controllers/ahoy_analytics/devices_controller.rb +14 -0
  78. data/app/controllers/ahoy_analytics/export_controller.rb +12 -0
  79. data/app/controllers/ahoy_analytics/live_controller.rb +9 -0
  80. data/app/controllers/ahoy_analytics/locations_controller.rb +14 -0
  81. data/app/controllers/ahoy_analytics/main_graph_controller.rb +10 -0
  82. data/app/controllers/ahoy_analytics/pages_controller.rb +14 -0
  83. data/app/controllers/ahoy_analytics/referrers_controller.rb +34 -0
  84. data/app/controllers/ahoy_analytics/search_terms_controller.rb +47 -0
  85. data/app/controllers/ahoy_analytics/sources_controller.rb +14 -0
  86. data/app/controllers/ahoy_analytics/top_stats_controller.rb +13 -0
  87. data/app/controllers/concerns/ahoy_analytics/set_current_request.rb +17 -0
  88. data/app/frontend/components/analytics/hex-highlights.tsx +165 -0
  89. data/app/frontend/components/analytics/hex-land-layer.tsx +61 -0
  90. data/app/frontend/components/analytics/metric-card.tsx +138 -0
  91. data/app/frontend/components/analytics/sessions-by-location.tsx +62 -0
  92. data/app/frontend/components/analytics/visitor-globe.tsx +424 -0
  93. data/app/frontend/components/ui/accordion.tsx +64 -0
  94. data/app/frontend/components/ui/alert.tsx +66 -0
  95. data/app/frontend/components/ui/avatar.tsx +53 -0
  96. data/app/frontend/components/ui/badge.tsx +46 -0
  97. data/app/frontend/components/ui/button.tsx +62 -0
  98. data/app/frontend/components/ui/calendar.tsx +212 -0
  99. data/app/frontend/components/ui/card.tsx +91 -0
  100. data/app/frontend/components/ui/checkbox.tsx +32 -0
  101. data/app/frontend/components/ui/dropdown-menu.tsx +255 -0
  102. data/app/frontend/components/ui/input.tsx +21 -0
  103. data/app/frontend/components/ui/label.tsx +22 -0
  104. data/app/frontend/components/ui/popover.tsx +46 -0
  105. data/app/frontend/components/ui/select.tsx +183 -0
  106. data/app/frontend/components/ui/separator.tsx +26 -0
  107. data/app/frontend/components/ui/sheet.tsx +139 -0
  108. data/app/frontend/components/ui/sidebar.tsx +726 -0
  109. data/app/frontend/components/ui/skeleton.tsx +13 -0
  110. data/app/frontend/components/ui/sonner.tsx +33 -0
  111. data/app/frontend/components/ui/tooltip.tsx +59 -0
  112. data/app/frontend/data/countries-110m.json +1 -0
  113. data/app/frontend/data/globe-data.json +1 -0
  114. data/app/frontend/entrypoints/analytics-tracker.ts +680 -0
  115. data/app/frontend/entrypoints/analytics-ui.tsx +26 -0
  116. data/app/frontend/entrypoints/analytics.css +77 -0
  117. data/app/frontend/layouts/analytics-layout.tsx +28 -0
  118. data/app/frontend/lib/cable.ts +13 -0
  119. data/app/frontend/lib/geocode.ts +65 -0
  120. data/app/frontend/lib/utils.ts +6 -0
  121. data/app/frontend/pages/admin/analytics/api.ts +221 -0
  122. data/app/frontend/pages/admin/analytics/hooks/use-debounce.ts +36 -0
  123. data/app/frontend/pages/admin/analytics/last-load-context.tsx +29 -0
  124. data/app/frontend/pages/admin/analytics/lib/base-path.ts +28 -0
  125. data/app/frontend/pages/admin/analytics/lib/dialog-path.ts +242 -0
  126. data/app/frontend/pages/admin/analytics/lib/number-formatter.ts +100 -0
  127. data/app/frontend/pages/admin/analytics/live.tsx +608 -0
  128. data/app/frontend/pages/admin/analytics/query-context.tsx +61 -0
  129. data/app/frontend/pages/admin/analytics/show.tsx +40 -0
  130. data/app/frontend/pages/admin/analytics/site-context.tsx +22 -0
  131. data/app/frontend/pages/admin/analytics/top-stats-context.tsx +37 -0
  132. data/app/frontend/pages/admin/analytics/types.ts +161 -0
  133. data/app/frontend/pages/admin/analytics/ui/analytics-dashboard.tsx +60 -0
  134. data/app/frontend/pages/admin/analytics/ui/behaviors-panel.tsx +456 -0
  135. data/app/frontend/pages/admin/analytics/ui/date-range-dialog.tsx +173 -0
  136. data/app/frontend/pages/admin/analytics/ui/details-button.tsx +33 -0
  137. data/app/frontend/pages/admin/analytics/ui/devices-panel.tsx +474 -0
  138. data/app/frontend/pages/admin/analytics/ui/filter-dialog.tsx +558 -0
  139. data/app/frontend/pages/admin/analytics/ui/list-table.tsx +346 -0
  140. data/app/frontend/pages/admin/analytics/ui/locations-panel.tsx +566 -0
  141. data/app/frontend/pages/admin/analytics/ui/pages-panel.tsx +207 -0
  142. data/app/frontend/pages/admin/analytics/ui/panel-tabs.tsx +65 -0
  143. data/app/frontend/pages/admin/analytics/ui/remote-details-dialog.tsx +356 -0
  144. data/app/frontend/pages/admin/analytics/ui/simple-tabs.tsx +54 -0
  145. data/app/frontend/pages/admin/analytics/ui/sources-panel.tsx +771 -0
  146. data/app/frontend/pages/admin/analytics/ui/top-bar.tsx +793 -0
  147. data/app/frontend/pages/admin/analytics/ui/visitor-graph.tsx +891 -0
  148. data/app/frontend/pages/admin/analytics/user-context.tsx +22 -0
  149. data/app/frontend/styles/shared.css +156 -0
  150. data/app/helpers/ahoy_analytics/application_helper.rb +96 -0
  151. data/app/jobs/ahoy_analytics/application_job.rb +4 -0
  152. data/app/jobs/ahoy_analytics/update_job.rb +12 -0
  153. data/app/mailers/ahoy_analytics/application_mailer.rb +6 -0
  154. data/app/models/ahoy/event/filters.rb +7 -0
  155. data/app/models/ahoy/event.rb +9 -0
  156. data/app/models/ahoy/visit/cache_key.rb +15 -0
  157. data/app/models/ahoy/visit/constants.rb +11 -0
  158. data/app/models/ahoy/visit/devices.rb +144 -0
  159. data/app/models/ahoy/visit/export.rb +24 -0
  160. data/app/models/ahoy/visit/filters.rb +286 -0
  161. data/app/models/ahoy/visit/imports.rb +36 -0
  162. data/app/models/ahoy/visit/locations.rb +276 -0
  163. data/app/models/ahoy/visit/metrics.rb +473 -0
  164. data/app/models/ahoy/visit/ordering.rb +110 -0
  165. data/app/models/ahoy/visit/pages.rb +533 -0
  166. data/app/models/ahoy/visit/pagination.rb +17 -0
  167. data/app/models/ahoy/visit/ranges.rb +227 -0
  168. data/app/models/ahoy/visit/series.rb +177 -0
  169. data/app/models/ahoy/visit/sources.rb +418 -0
  170. data/app/models/ahoy/visit/url_labels.rb +32 -0
  171. data/app/models/ahoy/visit.rb +143 -0
  172. data/app/models/ahoy_analytics/application_record.rb +5 -0
  173. data/app/models/ahoy_analytics/current.rb +8 -0
  174. data/app/models/ahoy_analytics/funnel.rb +16 -0
  175. data/app/models/ahoy_analytics/imported_entry_page.rb +5 -0
  176. data/app/models/ahoy_analytics/imported_exit_page.rb +5 -0
  177. data/app/models/ahoy_analytics/imported_page.rb +5 -0
  178. data/app/models/ahoy_analytics/live_stats.rb +152 -0
  179. data/app/models/ahoy_analytics/setting.rb +19 -0
  180. data/app/models/analytics/source_catalog.rb +48 -0
  181. data/app/views/layouts/ahoy_analytics/application.html.erb +15 -0
  182. data/config/routes.rb +21 -0
  183. data/config/vite.json +22 -0
  184. data/db/migrate/20251006104056_create_ahoy_visits_and_events.rb +62 -0
  185. data/db/migrate/20251006105012_add_analytics_fields_to_ahoy_visits.rb +11 -0
  186. data/db/migrate/20251012090000_create_analytics_funnels_and_imports.rb +52 -0
  187. data/db/migrate/20251013021500_add_analytics_indexes.rb +14 -0
  188. data/lib/ahoy_analytics/ahoy_store.rb +429 -0
  189. data/lib/ahoy_analytics/asset_manifest.rb +56 -0
  190. data/lib/ahoy_analytics/device_bucket.rb +39 -0
  191. data/lib/ahoy_analytics/engine.rb +55 -0
  192. data/lib/ahoy_analytics/maxmind_geo.rb +77 -0
  193. data/lib/ahoy_analytics/version.rb +3 -0
  194. data/lib/ahoy_analytics.rb +52 -0
  195. data/lib/generators/ahoy_analytics/install/install_generator.rb +111 -0
  196. data/lib/generators/ahoy_analytics/install/templates/initializer.rb +28 -0
  197. data/lib/tasks/ahoy_analytics_tasks.rake +4 -0
  198. metadata +352 -0
@@ -0,0 +1,52 @@
1
+ require "ahoy_analytics/version"
2
+ require "ahoy"
3
+ require "inertia_rails"
4
+ require "ahoy_analytics/device_bucket"
5
+ require "ahoy_analytics/asset_manifest"
6
+ require "ahoy_analytics/maxmind_geo"
7
+ require "ahoy_analytics/ahoy_store"
8
+ require "ahoy_analytics/engine"
9
+
10
+ module AhoyAnalytics
11
+ class Configuration
12
+ attr_accessor :mount_path
13
+ attr_accessor :cable_path
14
+ attr_accessor :cable_stream
15
+ attr_accessor :ahoy_path
16
+ attr_accessor :tracking_exclude_paths
17
+ attr_accessor :tracking_include_paths
18
+ attr_accessor :tracking_hash_based_routing
19
+ attr_accessor :tracking_debug
20
+ attr_accessor :tracking_options
21
+ attr_accessor :use_vite_dev_server
22
+ attr_accessor :geocode_email
23
+ attr_accessor :user_context
24
+ attr_accessor :site_context
25
+ attr_accessor :gsc_configured
26
+
27
+ def initialize
28
+ @mount_path = nil
29
+ @cable_path = "/cable"
30
+ @cable_stream = "ahoy_analytics"
31
+ @ahoy_path = "/ahoy"
32
+ @tracking_exclude_paths = [ "/admin", "/.well-known", "/ahoy", "/cable" ]
33
+ @tracking_include_paths = []
34
+ @tracking_hash_based_routing = false
35
+ @tracking_debug = false
36
+ @tracking_options = {}
37
+ @use_vite_dev_server = false
38
+ @geocode_email = nil
39
+ @user_context = nil
40
+ @site_context = nil
41
+ @gsc_configured = nil
42
+ end
43
+ end
44
+
45
+ def self.config
46
+ @config ||= Configuration.new
47
+ end
48
+
49
+ def self.configure
50
+ yield config
51
+ end
52
+ end
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AhoyAnalytics
4
+ module Generators
5
+ class InstallGenerator < Rails::Generators::Base
6
+ source_root File.expand_path("templates", __dir__)
7
+
8
+ class_option :path, type: :string, default: "/admin/analytics", desc: "Mount path for AhoyAnalytics"
9
+ class_option :ahoy_path, type: :string, default: "/ahoy", desc: "Mount path for Ahoy"
10
+ class_option :cable_path, type: :string, default: "/cable", desc: "Action Cable mount path"
11
+
12
+ def add_routes
13
+ add_route("mount AhoyAnalytics::Engine => #{normalized_path(options[:path]).inspect}", "AhoyAnalytics::Engine")
14
+ add_route("mount ActionCable.server => #{normalized_path(options[:cable_path]).inspect}", "ActionCable.server")
15
+ end
16
+
17
+ def copy_initializer
18
+ @mount_path = normalized_path(options[:path])
19
+ @ahoy_path = normalized_path(options[:ahoy_path])
20
+ @cable_path = normalized_path(options[:cable_path])
21
+ template "initializer.rb", "config/initializers/ahoy_analytics.rb"
22
+ end
23
+
24
+ def insert_tracking_tag
25
+ layout_path = "app/views/layouts/application.html.erb"
26
+ return unless File.exist?(layout_path)
27
+
28
+ layout = File.read(layout_path)
29
+ return if layout.include?("ahoy_analytics_tracking_tag")
30
+
31
+ inject_into_file layout_path, "\n <%= ahoy_analytics_tracking_tag %>\n", before: "</head>"
32
+ end
33
+
34
+ def install_migrations
35
+ rake "railties:install:migrations FROM=ahoy_analytics"
36
+ end
37
+
38
+ def configure_live_updates
39
+ recurring_path = "config/recurring.yml"
40
+ unless File.exist?(recurring_path)
41
+ say_status(:info, "config/recurring.yml not found. Configure AhoyAnalytics::UpdateJob schedule manually if you want live updates.", :yellow)
42
+ return
43
+ end
44
+
45
+ added = insert_recurring_jobs(recurring_path)
46
+ if added
47
+ say_status(:insert, recurring_path, :green)
48
+ else
49
+ say_status(:identical, recurring_path, :blue)
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ def add_route(route_line, guard_text)
56
+ routes_path = "config/routes.rb"
57
+ return unless File.exist?(routes_path)
58
+ return if File.read(routes_path).include?(guard_text)
59
+
60
+ route(route_line)
61
+ end
62
+
63
+ def normalized_path(path)
64
+ value = path.to_s.strip
65
+ value = "/#{value}" unless value.start_with?("/")
66
+ value.gsub(%r{/+$}, "")
67
+ end
68
+
69
+ def insert_recurring_jobs(path)
70
+ require "yaml"
71
+
72
+ contents = File.read(path)
73
+ config = YAML.safe_load(contents, permitted_classes: [Symbol]) || {}
74
+
75
+ added = false
76
+ %w[development production].each do |env|
77
+ config[env] ||= {}
78
+ unless config[env].key?("ahoy_analytics_live_updates")
79
+ # Create a new hash instance for each env to avoid YAML anchors/aliases
80
+ config[env]["ahoy_analytics_live_updates"] = {
81
+ "class" => "AhoyAnalytics::UpdateJob",
82
+ "queue" => "default",
83
+ "schedule" => "every 30 seconds"
84
+ }
85
+ added = true
86
+ end
87
+ end
88
+
89
+ return false unless added
90
+
91
+ # Preserve comments at the top of the file
92
+ comment_lines = []
93
+ contents.each_line do |line|
94
+ break unless line.start_with?("#") || line.strip.empty?
95
+ comment_lines << line
96
+ end
97
+
98
+ new_contents = comment_lines.join
99
+ new_contents += "\n" if comment_lines.any? && !comment_lines.last.end_with?("\n\n")
100
+
101
+ yaml_output = YAML.dump(config).sub(/\A---\n/, "")
102
+ # Add blank line between top-level keys (environments)
103
+ yaml_output = yaml_output.gsub(/^(\S+:)/) { |match| "\n#{match}" }.sub(/\A\n/, "")
104
+ new_contents += yaml_output
105
+
106
+ File.write(path, new_contents)
107
+ true
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,28 @@
1
+ AhoyAnalytics.configure do |config|
2
+ config.mount_path = "<%= @mount_path %>"
3
+ config.ahoy_path = "<%= @ahoy_path %>"
4
+ config.cable_path = "<%= @cable_path %>"
5
+ config.cable_stream = "ahoy_analytics"
6
+ # Optional: enable Vite dev server for engine UI while developing locally.
7
+ # config.use_vite_dev_server = Rails.env.development?
8
+ config.use_vite_dev_server = false
9
+
10
+ config.tracking_exclude_paths = [
11
+ "/admin",
12
+ "/.well-known",
13
+ config.ahoy_path,
14
+ config.cable_path,
15
+ config.mount_path
16
+ ].compact.uniq
17
+
18
+ # Optional: supply a contact email for geocoding requests (OpenStreetMap Nominatim).
19
+ config.geocode_email = ENV["AHOY_ANALYTICS_GEOCODE_EMAIL"]
20
+ # Optional: point to GeoLite2-City.mmdb for server-side GeoIP.
21
+ # ENV["MAXMIND_DB_PATH"] = Rails.root.join("db/geo/GeoLite2-City.mmdb").to_s
22
+
23
+ # Optional: provide current user info for the UI header.
24
+ # config.user_context = -> { { role: "admin", email: current_user&.email.to_s } }
25
+
26
+ # Optional: tweak site capabilities shown in the UI.
27
+ # config.site_context = -> { { has_goals: false, has_props: true } }
28
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :ahoy_analytics do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,352 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ahoy_analytics
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Tom Ho
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rails
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '8.1'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '8.1'
26
+ - !ruby/object:Gem::Dependency
27
+ name: ahoy_matey
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: inertia_rails
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: device_detector
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: maxminddb
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: countries
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '8.0'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '8.0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: csv
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: vite_rails
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ description: Live analytics tracking for Ruby on Rails apps. No need for third-party
125
+ services, just plug and run.
126
+ email:
127
+ - hxtxmu@gmail.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - MIT-LICENSE
133
+ - README.md
134
+ - Rakefile
135
+ - app/assets/ahoy_analytics/build/assets/Combination-BpSXUjp9.js
136
+ - app/assets/ahoy_analytics/build/assets/analytics-5KyfCxh6.css
137
+ - app/assets/ahoy_analytics/build/assets/analytics-dashboard-uOXx8zYZ.js
138
+ - app/assets/ahoy_analytics/build/assets/analytics-layout-ClAft5OU.js
139
+ - app/assets/ahoy_analytics/build/assets/analytics-tracker-B3f8P98z.js
140
+ - app/assets/ahoy_analytics/build/assets/analytics-ui-DMSkNqd6.js
141
+ - app/assets/ahoy_analytics/build/assets/behaviors-panel-ChNGYbdH.js
142
+ - app/assets/ahoy_analytics/build/assets/button-JVCrlR4s.js
143
+ - app/assets/ahoy_analytics/build/assets/cable-DO-7y1-E.js
144
+ - app/assets/ahoy_analytics/build/assets/createLucideIcon-BGzacY2v.js
145
+ - app/assets/ahoy_analytics/build/assets/date-range-dialog-DWDp3cLG.js
146
+ - app/assets/ahoy_analytics/build/assets/details-button-NqKfSGEG.js
147
+ - app/assets/ahoy_analytics/build/assets/devices-panel-cXvlmNBY.js
148
+ - app/assets/ahoy_analytics/build/assets/dialog-path-BBPNlB4Z.js
149
+ - app/assets/ahoy_analytics/build/assets/dropdown-menu-Adj3O5fh.js
150
+ - app/assets/ahoy_analytics/build/assets/filter-dialog-BN-rf4lp.js
151
+ - app/assets/ahoy_analytics/build/assets/index-B1K1NTKT.js
152
+ - app/assets/ahoy_analytics/build/assets/index-BcHeb-Rh.js
153
+ - app/assets/ahoy_analytics/build/assets/index-DzpzLoG4.js
154
+ - app/assets/ahoy_analytics/build/assets/index-vX97OY1J.js
155
+ - app/assets/ahoy_analytics/build/assets/input-e4v_v0kE.js
156
+ - app/assets/ahoy_analytics/build/assets/jsx-runtime-u17CrQMm.js
157
+ - app/assets/ahoy_analytics/build/assets/last-load-context-De5uA95L.js
158
+ - app/assets/ahoy_analytics/build/assets/list-table-ChHEzzF9.js
159
+ - app/assets/ahoy_analytics/build/assets/live-Cp2MHECh.js
160
+ - app/assets/ahoy_analytics/build/assets/locations-panel-BaISRmaQ.js
161
+ - app/assets/ahoy_analytics/build/assets/mercator-BnxX5RzL.js
162
+ - app/assets/ahoy_analytics/build/assets/pages-panel-Bh25L8mP.js
163
+ - app/assets/ahoy_analytics/build/assets/panel-tabs-B2kvGFJx.js
164
+ - app/assets/ahoy_analytics/build/assets/query-context-B-PgE00D.js
165
+ - app/assets/ahoy_analytics/build/assets/remote-details-dialog-DDTcKaM5.js
166
+ - app/assets/ahoy_analytics/build/assets/show-CCRicksg.js
167
+ - app/assets/ahoy_analytics/build/assets/simple-tabs-D6G6Bs0k.js
168
+ - app/assets/ahoy_analytics/build/assets/site-context-BNteYRlR.js
169
+ - app/assets/ahoy_analytics/build/assets/sources-panel-DyB21hxD.js
170
+ - app/assets/ahoy_analytics/build/assets/top-bar-FSiLBjq6.js
171
+ - app/assets/ahoy_analytics/build/assets/top-stats-context-DU15P9jS.js
172
+ - app/assets/ahoy_analytics/build/assets/use-debounce-VBpXQRL8.js
173
+ - app/assets/ahoy_analytics/build/assets/user-context-DbYteluY.js
174
+ - app/assets/ahoy_analytics/build/assets/visitor-globe-BWLDihid.js
175
+ - app/assets/ahoy_analytics/build/assets/visitor-graph-uKXjLvcu.js
176
+ - app/assets/ahoy_analytics/images/icon/browser/brave.svg
177
+ - app/assets/ahoy_analytics/images/icon/browser/chrome.svg
178
+ - app/assets/ahoy_analytics/images/icon/browser/chromium.svg
179
+ - app/assets/ahoy_analytics/images/icon/browser/duckduckgo.svg
180
+ - app/assets/ahoy_analytics/images/icon/browser/edge.svg
181
+ - app/assets/ahoy_analytics/images/icon/browser/fallback.svg
182
+ - app/assets/ahoy_analytics/images/icon/browser/firefox.svg
183
+ - app/assets/ahoy_analytics/images/icon/browser/opera.svg
184
+ - app/assets/ahoy_analytics/images/icon/browser/safari.png
185
+ - app/assets/ahoy_analytics/images/icon/browser/samsung-internet.svg
186
+ - app/assets/ahoy_analytics/images/icon/browser/uc.svg
187
+ - app/assets/ahoy_analytics/images/icon/browser/vivaldi.svg
188
+ - app/assets/ahoy_analytics/images/icon/browser/yandex.png
189
+ - app/assets/ahoy_analytics/images/icon/os/android.png
190
+ - app/assets/ahoy_analytics/images/icon/os/chrome_os.png
191
+ - app/assets/ahoy_analytics/images/icon/os/fallback.svg
192
+ - app/assets/ahoy_analytics/images/icon/os/fedora.png
193
+ - app/assets/ahoy_analytics/images/icon/os/freebsd.png
194
+ - app/assets/ahoy_analytics/images/icon/os/gnu_linux.png
195
+ - app/assets/ahoy_analytics/images/icon/os/ios.png
196
+ - app/assets/ahoy_analytics/images/icon/os/ipad_os.png
197
+ - app/assets/ahoy_analytics/images/icon/os/mac.png
198
+ - app/assets/ahoy_analytics/images/icon/os/ubuntu.png
199
+ - app/assets/ahoy_analytics/images/icon/os/windows.png
200
+ - app/assets/stylesheets/ahoy_analytics/application.css
201
+ - app/channels/ahoy_analytics/analytics_channel.rb
202
+ - app/controllers/ahoy_analytics/analytics_controller.rb
203
+ - app/controllers/ahoy_analytics/application_controller.rb
204
+ - app/controllers/ahoy_analytics/assets_controller.rb
205
+ - app/controllers/ahoy_analytics/base_controller.rb
206
+ - app/controllers/ahoy_analytics/behaviors_controller.rb
207
+ - app/controllers/ahoy_analytics/devices_controller.rb
208
+ - app/controllers/ahoy_analytics/export_controller.rb
209
+ - app/controllers/ahoy_analytics/live_controller.rb
210
+ - app/controllers/ahoy_analytics/locations_controller.rb
211
+ - app/controllers/ahoy_analytics/main_graph_controller.rb
212
+ - app/controllers/ahoy_analytics/pages_controller.rb
213
+ - app/controllers/ahoy_analytics/referrers_controller.rb
214
+ - app/controllers/ahoy_analytics/search_terms_controller.rb
215
+ - app/controllers/ahoy_analytics/sources_controller.rb
216
+ - app/controllers/ahoy_analytics/top_stats_controller.rb
217
+ - app/controllers/concerns/ahoy_analytics/set_current_request.rb
218
+ - app/frontend/components/analytics/hex-highlights.tsx
219
+ - app/frontend/components/analytics/hex-land-layer.tsx
220
+ - app/frontend/components/analytics/metric-card.tsx
221
+ - app/frontend/components/analytics/sessions-by-location.tsx
222
+ - app/frontend/components/analytics/visitor-globe.tsx
223
+ - app/frontend/components/ui/accordion.tsx
224
+ - app/frontend/components/ui/alert.tsx
225
+ - app/frontend/components/ui/avatar.tsx
226
+ - app/frontend/components/ui/badge.tsx
227
+ - app/frontend/components/ui/button.tsx
228
+ - app/frontend/components/ui/calendar.tsx
229
+ - app/frontend/components/ui/card.tsx
230
+ - app/frontend/components/ui/checkbox.tsx
231
+ - app/frontend/components/ui/dropdown-menu.tsx
232
+ - app/frontend/components/ui/input.tsx
233
+ - app/frontend/components/ui/label.tsx
234
+ - app/frontend/components/ui/popover.tsx
235
+ - app/frontend/components/ui/select.tsx
236
+ - app/frontend/components/ui/separator.tsx
237
+ - app/frontend/components/ui/sheet.tsx
238
+ - app/frontend/components/ui/sidebar.tsx
239
+ - app/frontend/components/ui/skeleton.tsx
240
+ - app/frontend/components/ui/sonner.tsx
241
+ - app/frontend/components/ui/tooltip.tsx
242
+ - app/frontend/data/countries-110m.json
243
+ - app/frontend/data/globe-data.json
244
+ - app/frontend/entrypoints/analytics-tracker.ts
245
+ - app/frontend/entrypoints/analytics-ui.tsx
246
+ - app/frontend/entrypoints/analytics.css
247
+ - app/frontend/layouts/analytics-layout.tsx
248
+ - app/frontend/lib/cable.ts
249
+ - app/frontend/lib/geocode.ts
250
+ - app/frontend/lib/utils.ts
251
+ - app/frontend/pages/admin/analytics/api.ts
252
+ - app/frontend/pages/admin/analytics/hooks/use-debounce.ts
253
+ - app/frontend/pages/admin/analytics/last-load-context.tsx
254
+ - app/frontend/pages/admin/analytics/lib/base-path.ts
255
+ - app/frontend/pages/admin/analytics/lib/dialog-path.ts
256
+ - app/frontend/pages/admin/analytics/lib/number-formatter.ts
257
+ - app/frontend/pages/admin/analytics/live.tsx
258
+ - app/frontend/pages/admin/analytics/query-context.tsx
259
+ - app/frontend/pages/admin/analytics/show.tsx
260
+ - app/frontend/pages/admin/analytics/site-context.tsx
261
+ - app/frontend/pages/admin/analytics/top-stats-context.tsx
262
+ - app/frontend/pages/admin/analytics/types.ts
263
+ - app/frontend/pages/admin/analytics/ui/analytics-dashboard.tsx
264
+ - app/frontend/pages/admin/analytics/ui/behaviors-panel.tsx
265
+ - app/frontend/pages/admin/analytics/ui/date-range-dialog.tsx
266
+ - app/frontend/pages/admin/analytics/ui/details-button.tsx
267
+ - app/frontend/pages/admin/analytics/ui/devices-panel.tsx
268
+ - app/frontend/pages/admin/analytics/ui/filter-dialog.tsx
269
+ - app/frontend/pages/admin/analytics/ui/list-table.tsx
270
+ - app/frontend/pages/admin/analytics/ui/locations-panel.tsx
271
+ - app/frontend/pages/admin/analytics/ui/pages-panel.tsx
272
+ - app/frontend/pages/admin/analytics/ui/panel-tabs.tsx
273
+ - app/frontend/pages/admin/analytics/ui/remote-details-dialog.tsx
274
+ - app/frontend/pages/admin/analytics/ui/simple-tabs.tsx
275
+ - app/frontend/pages/admin/analytics/ui/sources-panel.tsx
276
+ - app/frontend/pages/admin/analytics/ui/top-bar.tsx
277
+ - app/frontend/pages/admin/analytics/ui/visitor-graph.tsx
278
+ - app/frontend/pages/admin/analytics/user-context.tsx
279
+ - app/frontend/styles/shared.css
280
+ - app/helpers/ahoy_analytics/application_helper.rb
281
+ - app/jobs/ahoy_analytics/application_job.rb
282
+ - app/jobs/ahoy_analytics/update_job.rb
283
+ - app/mailers/ahoy_analytics/application_mailer.rb
284
+ - app/models/ahoy/event.rb
285
+ - app/models/ahoy/event/filters.rb
286
+ - app/models/ahoy/visit.rb
287
+ - app/models/ahoy/visit/cache_key.rb
288
+ - app/models/ahoy/visit/constants.rb
289
+ - app/models/ahoy/visit/devices.rb
290
+ - app/models/ahoy/visit/export.rb
291
+ - app/models/ahoy/visit/filters.rb
292
+ - app/models/ahoy/visit/imports.rb
293
+ - app/models/ahoy/visit/locations.rb
294
+ - app/models/ahoy/visit/metrics.rb
295
+ - app/models/ahoy/visit/ordering.rb
296
+ - app/models/ahoy/visit/pages.rb
297
+ - app/models/ahoy/visit/pagination.rb
298
+ - app/models/ahoy/visit/ranges.rb
299
+ - app/models/ahoy/visit/series.rb
300
+ - app/models/ahoy/visit/sources.rb
301
+ - app/models/ahoy/visit/url_labels.rb
302
+ - app/models/ahoy_analytics/application_record.rb
303
+ - app/models/ahoy_analytics/current.rb
304
+ - app/models/ahoy_analytics/funnel.rb
305
+ - app/models/ahoy_analytics/imported_entry_page.rb
306
+ - app/models/ahoy_analytics/imported_exit_page.rb
307
+ - app/models/ahoy_analytics/imported_page.rb
308
+ - app/models/ahoy_analytics/live_stats.rb
309
+ - app/models/ahoy_analytics/setting.rb
310
+ - app/models/analytics/source_catalog.rb
311
+ - app/views/layouts/ahoy_analytics/application.html.erb
312
+ - config/routes.rb
313
+ - config/vite.json
314
+ - db/migrate/20251006104056_create_ahoy_visits_and_events.rb
315
+ - db/migrate/20251006105012_add_analytics_fields_to_ahoy_visits.rb
316
+ - db/migrate/20251012090000_create_analytics_funnels_and_imports.rb
317
+ - db/migrate/20251013021500_add_analytics_indexes.rb
318
+ - lib/ahoy_analytics.rb
319
+ - lib/ahoy_analytics/ahoy_store.rb
320
+ - lib/ahoy_analytics/asset_manifest.rb
321
+ - lib/ahoy_analytics/device_bucket.rb
322
+ - lib/ahoy_analytics/engine.rb
323
+ - lib/ahoy_analytics/maxmind_geo.rb
324
+ - lib/ahoy_analytics/version.rb
325
+ - lib/generators/ahoy_analytics/install/install_generator.rb
326
+ - lib/generators/ahoy_analytics/install/templates/initializer.rb
327
+ - lib/tasks/ahoy_analytics_tasks.rake
328
+ homepage: https://github.com/darkamenosa/ahoy_analytics
329
+ licenses:
330
+ - MIT
331
+ metadata:
332
+ homepage_uri: https://github.com/darkamenosa/ahoy_analytics
333
+ source_code_uri: https://github.com/darkamenosa/ahoy_analytics
334
+ rdoc_options: []
335
+ require_paths:
336
+ - lib
337
+ required_ruby_version: !ruby/object:Gem::Requirement
338
+ requirements:
339
+ - - ">="
340
+ - !ruby/object:Gem::Version
341
+ version: '0'
342
+ required_rubygems_version: !ruby/object:Gem::Requirement
343
+ requirements:
344
+ - - ">="
345
+ - !ruby/object:Gem::Version
346
+ version: '0'
347
+ requirements: []
348
+ rubygems_version: 3.7.2
349
+ specification_version: 4
350
+ summary: Live analytics tracking for Rails apps. No third-party services, just plug
351
+ and run.
352
+ test_files: []