dbwatcher 0.1.5 → 1.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 (137) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +81 -210
  3. data/app/assets/config/dbwatcher_manifest.js +15 -0
  4. data/app/assets/javascripts/dbwatcher/alpine_registrations.js +39 -0
  5. data/app/assets/javascripts/dbwatcher/auto_init.js +23 -0
  6. data/app/assets/javascripts/dbwatcher/components/base.js +141 -0
  7. data/app/assets/javascripts/dbwatcher/components/changes_table_hybrid.js +1008 -0
  8. data/app/assets/javascripts/dbwatcher/components/diagrams.js +449 -0
  9. data/app/assets/javascripts/dbwatcher/components/summary.js +234 -0
  10. data/app/assets/javascripts/dbwatcher/core/alpine_store.js +138 -0
  11. data/app/assets/javascripts/dbwatcher/core/api_client.js +162 -0
  12. data/app/assets/javascripts/dbwatcher/core/component_loader.js +70 -0
  13. data/app/assets/javascripts/dbwatcher/core/component_registry.js +94 -0
  14. data/app/assets/javascripts/dbwatcher/dbwatcher.js +120 -0
  15. data/app/assets/javascripts/dbwatcher/services/mermaid.js +315 -0
  16. data/app/assets/javascripts/dbwatcher/services/mermaid_service.js +199 -0
  17. data/app/assets/javascripts/dbwatcher/vendor/date-fns-browser.js +99 -0
  18. data/app/assets/javascripts/dbwatcher/vendor/lodash.min.js +140 -0
  19. data/app/assets/javascripts/dbwatcher/vendor/tabulator.min.js +3 -0
  20. data/app/assets/stylesheets/dbwatcher/application.css +423 -0
  21. data/app/assets/stylesheets/dbwatcher/application.scss +15 -0
  22. data/app/assets/stylesheets/dbwatcher/components/_badges.scss +38 -0
  23. data/app/assets/stylesheets/dbwatcher/components/_compact_table.scss +162 -0
  24. data/app/assets/stylesheets/dbwatcher/components/_diagrams.scss +51 -0
  25. data/app/assets/stylesheets/dbwatcher/components/_forms.scss +27 -0
  26. data/app/assets/stylesheets/dbwatcher/components/_navigation.scss +55 -0
  27. data/app/assets/stylesheets/dbwatcher/core/_base.scss +34 -0
  28. data/app/assets/stylesheets/dbwatcher/core/_variables.scss +47 -0
  29. data/app/assets/stylesheets/dbwatcher/vendor/tabulator.min.css +2 -0
  30. data/app/controllers/dbwatcher/api/v1/sessions_controller.rb +64 -0
  31. data/app/controllers/dbwatcher/base_controller.rb +101 -0
  32. data/app/controllers/dbwatcher/dashboard_controller.rb +20 -0
  33. data/app/controllers/dbwatcher/queries_controller.rb +24 -0
  34. data/app/controllers/dbwatcher/sessions_controller.rb +30 -20
  35. data/app/controllers/dbwatcher/tables_controller.rb +38 -0
  36. data/app/helpers/dbwatcher/application_helper.rb +103 -0
  37. data/app/helpers/dbwatcher/component_helper.rb +29 -0
  38. data/app/helpers/dbwatcher/diagram_helper.rb +110 -0
  39. data/app/helpers/dbwatcher/formatting_helper.rb +108 -0
  40. data/app/helpers/dbwatcher/session_helper.rb +28 -0
  41. data/app/views/dbwatcher/dashboard/index.html.erb +177 -0
  42. data/app/views/dbwatcher/queries/index.html.erb +240 -0
  43. data/app/views/dbwatcher/sessions/_changes_tab.html.erb +265 -0
  44. data/app/views/dbwatcher/sessions/_diagrams_tab.html.erb +166 -0
  45. data/app/views/dbwatcher/sessions/_session_header.html.erb +11 -0
  46. data/app/views/dbwatcher/sessions/_summary_tab.html.erb +88 -0
  47. data/app/views/dbwatcher/sessions/_tab_navigation.html.erb +12 -0
  48. data/app/views/dbwatcher/sessions/changes.html.erb +21 -0
  49. data/app/views/dbwatcher/sessions/components/changes/_filters.html.erb +44 -0
  50. data/app/views/dbwatcher/sessions/components/changes/_table_list.html.erb +96 -0
  51. data/app/views/dbwatcher/sessions/diagrams.html.erb +21 -0
  52. data/app/views/dbwatcher/sessions/index.html.erb +124 -27
  53. data/app/views/dbwatcher/sessions/shared/_layout.html.erb +8 -0
  54. data/app/views/dbwatcher/sessions/shared/_navigation.html.erb +35 -0
  55. data/app/views/dbwatcher/sessions/shared/_session_header.html.erb +25 -0
  56. data/app/views/dbwatcher/sessions/show.html.erb +3 -149
  57. data/app/views/dbwatcher/sessions/summary.html.erb +21 -0
  58. data/app/views/dbwatcher/shared/_badge.html.erb +4 -0
  59. data/app/views/dbwatcher/shared/_data_table.html.erb +20 -0
  60. data/app/views/dbwatcher/shared/_header.html.erb +7 -0
  61. data/app/views/dbwatcher/shared/_page_layout.html.erb +20 -0
  62. data/app/views/dbwatcher/shared/_section_panel.html.erb +9 -0
  63. data/app/views/dbwatcher/shared/_stats_card.html.erb +11 -0
  64. data/app/views/dbwatcher/shared/_tab_bar.html.erb +6 -0
  65. data/app/views/dbwatcher/tables/changes.html.erb +225 -0
  66. data/app/views/dbwatcher/tables/index.html.erb +123 -0
  67. data/app/views/dbwatcher/tables/show.html.erb +86 -0
  68. data/app/views/layouts/dbwatcher/application.html.erb +252 -25
  69. data/bin/compile_scss +49 -0
  70. data/config/routes.rb +43 -3
  71. data/lib/dbwatcher/configuration.rb +103 -1
  72. data/lib/dbwatcher/engine.rb +28 -13
  73. data/lib/dbwatcher/logging.rb +72 -0
  74. data/lib/dbwatcher/services/analyzers/session_data_processor.rb +98 -0
  75. data/lib/dbwatcher/services/analyzers/table_summary_builder.rb +202 -0
  76. data/lib/dbwatcher/services/api/base_api_service.rb +100 -0
  77. data/lib/dbwatcher/services/api/changes_data_service.rb +112 -0
  78. data/lib/dbwatcher/services/api/diagram_data_service.rb +145 -0
  79. data/lib/dbwatcher/services/api/summary_data_service.rb +158 -0
  80. data/lib/dbwatcher/services/base_service.rb +64 -0
  81. data/lib/dbwatcher/services/dashboard_data_aggregator.rb +121 -0
  82. data/lib/dbwatcher/services/diagram_analyzers/base_analyzer.rb +162 -0
  83. data/lib/dbwatcher/services/diagram_analyzers/foreign_key_analyzer.rb +354 -0
  84. data/lib/dbwatcher/services/diagram_analyzers/inferred_relationship_analyzer.rb +502 -0
  85. data/lib/dbwatcher/services/diagram_analyzers/model_association_analyzer.rb +564 -0
  86. data/lib/dbwatcher/services/diagram_data/attribute.rb +154 -0
  87. data/lib/dbwatcher/services/diagram_data/dataset.rb +278 -0
  88. data/lib/dbwatcher/services/diagram_data/entity.rb +180 -0
  89. data/lib/dbwatcher/services/diagram_data/relationship.rb +188 -0
  90. data/lib/dbwatcher/services/diagram_data/relationship_params.rb +55 -0
  91. data/lib/dbwatcher/services/diagram_data.rb +65 -0
  92. data/lib/dbwatcher/services/diagram_error_handler.rb +239 -0
  93. data/lib/dbwatcher/services/diagram_generator.rb +154 -0
  94. data/lib/dbwatcher/services/diagram_strategies/base_diagram_strategy.rb +149 -0
  95. data/lib/dbwatcher/services/diagram_strategies/class_diagram_strategy.rb +49 -0
  96. data/lib/dbwatcher/services/diagram_strategies/erd_diagram_strategy.rb +52 -0
  97. data/lib/dbwatcher/services/diagram_strategies/flowchart_diagram_strategy.rb +52 -0
  98. data/lib/dbwatcher/services/diagram_system.rb +69 -0
  99. data/lib/dbwatcher/services/diagram_type_registry.rb +164 -0
  100. data/lib/dbwatcher/services/mermaid_syntax/base_builder.rb +127 -0
  101. data/lib/dbwatcher/services/mermaid_syntax/cardinality_mapper.rb +90 -0
  102. data/lib/dbwatcher/services/mermaid_syntax/class_diagram_builder.rb +136 -0
  103. data/lib/dbwatcher/services/mermaid_syntax/class_diagram_helper.rb +46 -0
  104. data/lib/dbwatcher/services/mermaid_syntax/erd_builder.rb +116 -0
  105. data/lib/dbwatcher/services/mermaid_syntax/flowchart_builder.rb +109 -0
  106. data/lib/dbwatcher/services/mermaid_syntax/sanitizer.rb +102 -0
  107. data/lib/dbwatcher/services/mermaid_syntax_builder.rb +155 -0
  108. data/lib/dbwatcher/services/query_filter_processor.rb +114 -0
  109. data/lib/dbwatcher/services/table_statistics_collector.rb +119 -0
  110. data/lib/dbwatcher/sql_logger.rb +107 -0
  111. data/lib/dbwatcher/storage/api/base_api.rb +134 -0
  112. data/lib/dbwatcher/storage/api/concerns/table_analyzer.rb +59 -0
  113. data/lib/dbwatcher/storage/api/query_api.rb +95 -0
  114. data/lib/dbwatcher/storage/api/session_api.rb +181 -0
  115. data/lib/dbwatcher/storage/api/table_api.rb +86 -0
  116. data/lib/dbwatcher/storage/base_storage.rb +120 -0
  117. data/lib/dbwatcher/storage/change_processor.rb +65 -0
  118. data/lib/dbwatcher/storage/concerns/data_normalizer.rb +134 -0
  119. data/lib/dbwatcher/storage/concerns/error_handler.rb +75 -0
  120. data/lib/dbwatcher/storage/concerns/timestampable.rb +74 -0
  121. data/lib/dbwatcher/storage/concerns/validatable.rb +117 -0
  122. data/lib/dbwatcher/storage/date_helper.rb +21 -0
  123. data/lib/dbwatcher/storage/errors.rb +86 -0
  124. data/lib/dbwatcher/storage/file_manager.rb +122 -0
  125. data/lib/dbwatcher/storage/null_session.rb +39 -0
  126. data/lib/dbwatcher/storage/query_storage.rb +338 -0
  127. data/lib/dbwatcher/storage/query_validator.rb +24 -0
  128. data/lib/dbwatcher/storage/session.rb +58 -0
  129. data/lib/dbwatcher/storage/session_operations.rb +37 -0
  130. data/lib/dbwatcher/storage/session_query.rb +71 -0
  131. data/lib/dbwatcher/storage/session_storage.rb +322 -0
  132. data/lib/dbwatcher/storage/table_storage.rb +237 -0
  133. data/lib/dbwatcher/storage.rb +112 -85
  134. data/lib/dbwatcher/tracker.rb +4 -55
  135. data/lib/dbwatcher/version.rb +1 -1
  136. data/lib/dbwatcher.rb +70 -3
  137. metadata +140 -2
@@ -1,109 +1,136 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "storage/base_storage"
4
+ require_relative "storage/concerns/error_handler"
5
+ require_relative "storage/concerns/timestampable"
6
+ require_relative "storage/concerns/validatable"
7
+ require_relative "storage/concerns/data_normalizer"
8
+ require_relative "storage/session_storage"
9
+ require_relative "storage/query_storage"
10
+ require_relative "storage/table_storage"
11
+ require_relative "storage/session_query"
12
+ require_relative "storage/api/base_api"
13
+ require_relative "storage/api/query_api"
14
+ require_relative "storage/api/table_api"
15
+ require_relative "storage/api/session_api"
16
+ require_relative "storage/session"
17
+ require_relative "storage/errors"
18
+
3
19
  module Dbwatcher
4
- class Storage
20
+ # Storage module provides the main interface for database monitoring data persistence
21
+ #
22
+ # This module acts as a facade for different storage backends and provides
23
+ # clean API entry points for sessions, queries, and tables. It manages
24
+ # storage instances and provides cleanup operations.
25
+ #
26
+ # @example Basic usage
27
+ # Dbwatcher::Storage.sessions.create("My Session")
28
+ # Dbwatcher::Storage.sessions.recent.with_changes
29
+ # Dbwatcher::Storage.queries.save(query_data)
30
+ # Dbwatcher::Storage.tables.changes_for("users")
31
+ #
32
+ # @example Cleanup operations
33
+ # Dbwatcher::Storage.cleanup_old_sessions
34
+ # Dbwatcher::Storage.clear_all
35
+ # @see SessionAPI
36
+ # @see QueryAPI
37
+ # @see TableAPI
38
+ module Storage
5
39
  class << self
6
- def save_session(session)
7
- return unless session&.id
8
-
9
- ensure_storage_directory
10
-
11
- # Save individual session file
12
- session_file = File.join(sessions_path, "#{session.id}.json")
13
- File.write(session_file, JSON.pretty_generate(session.to_h))
14
-
15
- # Update index
16
- update_index(session)
17
-
18
- # Clean old sessions if needed
19
- cleanup_old_sessions
20
- rescue StandardError => e
21
- warn "Failed to save session #{session&.id}: #{e.message}"
40
+ # Provides access to session operations
41
+ #
42
+ # @return [SessionAPI] session API interface
43
+ # @example
44
+ # Dbwatcher::Storage.sessions.create("My Session")
45
+ # Dbwatcher::Storage.sessions.all
46
+ # Dbwatcher::Storage.sessions.recent.with_changes
47
+ def sessions
48
+ @sessions ||= Api::SessionAPI.new(session_storage)
22
49
  end
23
50
 
24
- def load_session(id)
25
- return nil if id.nil? || id.empty?
26
-
27
- session_file = File.join(sessions_path, "#{id}.json")
28
- return nil unless File.exist?(session_file)
29
-
30
- data = JSON.parse(File.read(session_file), symbolize_names: true)
31
- Tracker::Session.new(data)
32
- rescue JSON::ParserError => e
33
- warn "Failed to parse session file #{id}: #{e.message}"
34
- nil
35
- rescue StandardError => e
36
- warn "Failed to load session #{id}: #{e.message}"
37
- nil
51
+ # Provides access to query operations
52
+ #
53
+ # @return [QueryAPI] query API interface
54
+ # @example
55
+ # Dbwatcher::Storage.queries.save(query_data)
56
+ # Dbwatcher::Storage.queries.for_date(Date.today)
57
+ def queries
58
+ @queries ||= Api::QueryAPI.new(query_storage)
38
59
  end
39
60
 
40
- def all_sessions
41
- index_file = File.join(storage_path, "index.json")
42
- return [] unless File.exist?(index_file)
43
-
44
- JSON.parse(File.read(index_file), symbolize_names: true)
45
- rescue JSON::ParserError => e
46
- warn "Failed to parse sessions index: #{e.message}"
47
- []
48
- rescue StandardError => e
49
- warn "Failed to load sessions: #{e.message}"
50
- []
61
+ # Provides access to table operations
62
+ #
63
+ # @return [TableAPI] table API interface
64
+ # @example
65
+ # Dbwatcher::Storage.tables.changes_for("users")
66
+ # Dbwatcher::Storage.tables.recent_changes
67
+ def tables
68
+ @tables ||= Api::TableAPI.new(table_storage)
51
69
  end
52
70
 
53
- def reset!
54
- FileUtils.rm_rf(storage_path)
55
- ensure_storage_directory
71
+ # Resets all cached storage instances (primarily for testing)
72
+ #
73
+ # This method clears all memoized storage instances, forcing them
74
+ # to be recreated on next access. Useful for testing scenarios.
75
+ #
76
+ # @return [void]
77
+ # @example
78
+ # Dbwatcher::Storage.reset_storage_instances!
79
+ def reset_storage_instances!
80
+ @session_storage = nil
81
+ @query_storage = nil
82
+ @table_storage = nil
83
+ @sessions = nil
84
+ @queries = nil
85
+ @tables = nil
56
86
  end
57
87
 
58
- private
88
+ # Cleanup operations
59
89
 
60
- def storage_path
61
- Dbwatcher.configuration.storage_path
62
- end
63
-
64
- def sessions_path
65
- File.join(storage_path, "sessions")
90
+ # Removes old session files based on configuration
91
+ #
92
+ # Automatically removes session files that exceed the configured
93
+ # retention period. This helps manage storage space usage.
94
+ #
95
+ # @return [void]
96
+ # @see Configuration#auto_clean_after_days
97
+ def cleanup_old_sessions
98
+ session_storage.cleanup_old_sessions
66
99
  end
67
100
 
68
- def ensure_storage_directory
69
- FileUtils.mkdir_p(sessions_path)
101
+ # Direct access to storage instances (for internal use)
70
102
 
71
- # Create index if it doesn't exist
72
- index_file = File.join(storage_path, "index.json")
73
- File.write(index_file, "[]") unless File.exist?(index_file)
103
+ # Returns the session storage instance
104
+ #
105
+ # @return [SessionStorage] the session storage instance
106
+ # @api private
107
+ def session_storage
108
+ @session_storage ||= SessionStorage.new
74
109
  end
75
110
 
76
- def update_index(session)
77
- index_file = File.join(storage_path, "index.json")
78
- index = JSON.parse(File.read(index_file), symbolize_names: true)
79
-
80
- # Add new session summary to index
81
- index.unshift({
82
- id: session.id,
83
- name: session.name,
84
- started_at: session.started_at,
85
- ended_at: session.ended_at,
86
- change_count: session.changes.count
87
- })
88
-
89
- # Keep only max_sessions
90
- index = index.first(Dbwatcher.configuration.max_sessions)
91
-
92
- File.write(index_file, JSON.pretty_generate(index))
93
- rescue StandardError => e
94
- warn "Failed to update sessions index: #{e.message}"
111
+ # Returns the query storage instance
112
+ #
113
+ # @return [QueryStorage] the query storage instance
114
+ # @api private
115
+ def query_storage
116
+ @query_storage ||= QueryStorage.new
95
117
  end
96
118
 
97
- def cleanup_old_sessions
98
- return unless Dbwatcher.configuration.auto_clean_after_days
99
-
100
- cutoff_date = Time.now - (Dbwatcher.configuration.auto_clean_after_days * 24 * 60 * 60)
119
+ # Returns the table storage instance
120
+ #
121
+ # @return [TableStorage] the table storage instance
122
+ # @api private
123
+ def table_storage
124
+ @table_storage ||= TableStorage.new(session_storage)
125
+ end
101
126
 
102
- Dir.glob(File.join(sessions_path, "*.json")).each do |file|
103
- File.delete(file) if File.mtime(file) < cutoff_date
104
- end
105
- rescue StandardError => e
106
- warn "Failed to cleanup old sessions: #{e.message}"
127
+ # Clears all storage data
128
+ #
129
+ # @return [Integer] total number of files removed
130
+ def clear_all
131
+ session_count = session_storage.clear_all
132
+ query_count = query_storage.clear_all
133
+ session_count + query_count
107
134
  end
108
135
  end
109
136
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "storage/session"
4
+
3
5
  module Dbwatcher
4
6
  class Tracker
5
7
  class << self
@@ -30,7 +32,7 @@ module Dbwatcher
30
32
  private
31
33
 
32
34
  def create_session(name, metadata)
33
- Session.new(
35
+ Storage::Session.new(
34
36
  id: SecureRandom.uuid,
35
37
  name: name || "Session #{Time.now.strftime("%Y-%m-%d %H:%M:%S")}",
36
38
  metadata: metadata || {},
@@ -50,63 +52,10 @@ module Dbwatcher
50
52
 
51
53
  def finalize_session(session)
52
54
  session.ended_at = Time.now.strftime("%Y-%m-%dT%H:%M:%S%z")
53
- Storage.save_session(session)
55
+ Storage.sessions.create(session)
54
56
  rescue StandardError
55
57
  nil
56
58
  end
57
59
  end
58
-
59
- class Session
60
- attr_accessor :id, :name, :metadata, :started_at, :ended_at, :changes
61
-
62
- def initialize(attrs = {})
63
- # Set default values
64
- @changes = []
65
- @metadata = {}
66
-
67
- # Set provided attributes
68
- attrs.each do |key, value|
69
- setter_method = "#{key}="
70
- send(setter_method, value) if respond_to?(setter_method)
71
- end
72
- end
73
-
74
- def to_h
75
- {
76
- id: id,
77
- name: name,
78
- metadata: metadata,
79
- started_at: started_at,
80
- ended_at: ended_at,
81
- changes: changes
82
- }
83
- end
84
-
85
- def summary
86
- return {} unless changes.is_a?(Array)
87
-
88
- valid_changes = filter_valid_changes
89
- group_changes_by_operation(valid_changes)
90
- rescue StandardError => e
91
- warn "Failed to calculate session summary: #{e.message}"
92
- {}
93
- end
94
-
95
- private
96
-
97
- def filter_valid_changes
98
- changes.select { |change| valid_change?(change) }
99
- end
100
-
101
- def valid_change?(change)
102
- change.is_a?(Hash) && change[:table_name] && change[:operation]
103
- end
104
-
105
- def group_changes_by_operation(valid_changes)
106
- valid_changes
107
- .group_by { |change| "#{change[:table_name]},#{change[:operation]}" }
108
- .transform_values(&:count)
109
- end
110
- end
111
60
  end
112
61
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dbwatcher
4
- VERSION = "0.1.5"
4
+ VERSION = "1.1.0"
5
5
  end
data/lib/dbwatcher.rb CHANGED
@@ -3,12 +3,76 @@
3
3
  require "json"
4
4
  require "fileutils"
5
5
  require "securerandom"
6
+ require "singleton"
7
+ require "logger"
8
+
9
+ # Core components
6
10
  require_relative "dbwatcher/version"
7
11
  require_relative "dbwatcher/configuration"
8
- require_relative "dbwatcher/tracker"
12
+ require_relative "dbwatcher/logging"
13
+
14
+ # Storage layer
9
15
  require_relative "dbwatcher/storage"
16
+
17
+ # Tracking and SQL monitoring
18
+ require_relative "dbwatcher/tracker"
19
+ require_relative "dbwatcher/sql_logger"
10
20
  require_relative "dbwatcher/model_extension"
11
21
  require_relative "dbwatcher/middleware"
22
+
23
+ # Base services
24
+ require_relative "dbwatcher/services/base_service"
25
+
26
+ # Core services
27
+ require_relative "dbwatcher/services/table_statistics_collector"
28
+ require_relative "dbwatcher/services/dashboard_data_aggregator"
29
+ require_relative "dbwatcher/services/query_filter_processor"
30
+
31
+ # General analyzers
32
+ require_relative "dbwatcher/services/analyzers/session_data_processor"
33
+ require_relative "dbwatcher/services/analyzers/table_summary_builder"
34
+
35
+ # Diagram data models
36
+ require_relative "dbwatcher/services/diagram_data/attribute"
37
+ require_relative "dbwatcher/services/diagram_data/entity"
38
+ require_relative "dbwatcher/services/diagram_data/relationship"
39
+ require_relative "dbwatcher/services/diagram_data/dataset"
40
+ require_relative "dbwatcher/services/diagram_data"
41
+
42
+ # Diagram analyzers
43
+ require_relative "dbwatcher/services/diagram_analyzers/base_analyzer"
44
+ require_relative "dbwatcher/services/diagram_analyzers/foreign_key_analyzer"
45
+ require_relative "dbwatcher/services/diagram_analyzers/inferred_relationship_analyzer"
46
+ require_relative "dbwatcher/services/diagram_analyzers/model_association_analyzer"
47
+
48
+ # Mermaid syntax builders
49
+ require_relative "dbwatcher/services/mermaid_syntax/base_builder"
50
+ require_relative "dbwatcher/services/mermaid_syntax/sanitizer"
51
+ require_relative "dbwatcher/services/mermaid_syntax/cardinality_mapper"
52
+ require_relative "dbwatcher/services/mermaid_syntax/erd_builder"
53
+ require_relative "dbwatcher/services/mermaid_syntax/class_diagram_builder"
54
+ require_relative "dbwatcher/services/mermaid_syntax/flowchart_builder"
55
+ require_relative "dbwatcher/services/mermaid_syntax_builder"
56
+
57
+ # Diagram strategies
58
+ require_relative "dbwatcher/services/diagram_strategies/base_diagram_strategy"
59
+ require_relative "dbwatcher/services/diagram_strategies/erd_diagram_strategy"
60
+ require_relative "dbwatcher/services/diagram_strategies/class_diagram_strategy"
61
+ require_relative "dbwatcher/services/diagram_strategies/flowchart_diagram_strategy"
62
+
63
+ # Diagram system
64
+ require_relative "dbwatcher/services/diagram_error_handler"
65
+ require_relative "dbwatcher/services/diagram_type_registry"
66
+ require_relative "dbwatcher/services/diagram_generator"
67
+ require_relative "dbwatcher/services/diagram_system"
68
+
69
+ # API services
70
+ require_relative "dbwatcher/services/api/base_api_service"
71
+ require_relative "dbwatcher/services/api/changes_data_service"
72
+ require_relative "dbwatcher/services/api/summary_data_service"
73
+ require_relative "dbwatcher/services/api/diagram_data_service"
74
+
75
+ # Rails engine
12
76
  require_relative "dbwatcher/engine" if defined?(Rails)
13
77
 
14
78
  module Dbwatcher
@@ -33,8 +97,11 @@ module Dbwatcher
33
97
  Tracker.current_session
34
98
  end
35
99
 
36
- def reset!
37
- Storage.reset!
100
+ # Clears all stored data (sessions and queries)
101
+ #
102
+ # @return [Integer] total number of files removed
103
+ def clear_all
104
+ Storage.clear_all
38
105
  end
39
106
  end
40
107
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dbwatcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Huy Nguyen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-06-15 00:00:00.000000000 Z
11
+ date: 2025-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '6.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: sassc
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.4'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.4'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: selenium-webdriver
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -141,6 +155,7 @@ description: DB Watcher helps developers debug Rails applications by tracking al
141
155
  email:
142
156
  - patrick204nqh@gmail.com
143
157
  executables:
158
+ - compile_scss
144
159
  - console
145
160
  - release
146
161
  - setup
@@ -149,10 +164,73 @@ extra_rdoc_files: []
149
164
  files:
150
165
  - README.md
151
166
  - Rakefile
167
+ - app/assets/config/dbwatcher_manifest.js
168
+ - app/assets/javascripts/dbwatcher/alpine_registrations.js
169
+ - app/assets/javascripts/dbwatcher/auto_init.js
170
+ - app/assets/javascripts/dbwatcher/components/base.js
171
+ - app/assets/javascripts/dbwatcher/components/changes_table_hybrid.js
172
+ - app/assets/javascripts/dbwatcher/components/diagrams.js
173
+ - app/assets/javascripts/dbwatcher/components/summary.js
174
+ - app/assets/javascripts/dbwatcher/core/alpine_store.js
175
+ - app/assets/javascripts/dbwatcher/core/api_client.js
176
+ - app/assets/javascripts/dbwatcher/core/component_loader.js
177
+ - app/assets/javascripts/dbwatcher/core/component_registry.js
178
+ - app/assets/javascripts/dbwatcher/dbwatcher.js
179
+ - app/assets/javascripts/dbwatcher/services/mermaid.js
180
+ - app/assets/javascripts/dbwatcher/services/mermaid_service.js
181
+ - app/assets/javascripts/dbwatcher/vendor/date-fns-browser.js
182
+ - app/assets/javascripts/dbwatcher/vendor/lodash.min.js
183
+ - app/assets/javascripts/dbwatcher/vendor/tabulator.min.js
184
+ - app/assets/stylesheets/dbwatcher/application.css
185
+ - app/assets/stylesheets/dbwatcher/application.scss
186
+ - app/assets/stylesheets/dbwatcher/components/_badges.scss
187
+ - app/assets/stylesheets/dbwatcher/components/_compact_table.scss
188
+ - app/assets/stylesheets/dbwatcher/components/_diagrams.scss
189
+ - app/assets/stylesheets/dbwatcher/components/_forms.scss
190
+ - app/assets/stylesheets/dbwatcher/components/_navigation.scss
191
+ - app/assets/stylesheets/dbwatcher/core/_base.scss
192
+ - app/assets/stylesheets/dbwatcher/core/_variables.scss
193
+ - app/assets/stylesheets/dbwatcher/vendor/tabulator.min.css
194
+ - app/controllers/dbwatcher/api/v1/sessions_controller.rb
195
+ - app/controllers/dbwatcher/base_controller.rb
196
+ - app/controllers/dbwatcher/dashboard_controller.rb
197
+ - app/controllers/dbwatcher/queries_controller.rb
152
198
  - app/controllers/dbwatcher/sessions_controller.rb
199
+ - app/controllers/dbwatcher/tables_controller.rb
200
+ - app/helpers/dbwatcher/application_helper.rb
201
+ - app/helpers/dbwatcher/component_helper.rb
202
+ - app/helpers/dbwatcher/diagram_helper.rb
203
+ - app/helpers/dbwatcher/formatting_helper.rb
204
+ - app/helpers/dbwatcher/session_helper.rb
205
+ - app/views/dbwatcher/dashboard/index.html.erb
206
+ - app/views/dbwatcher/queries/index.html.erb
207
+ - app/views/dbwatcher/sessions/_changes_tab.html.erb
208
+ - app/views/dbwatcher/sessions/_diagrams_tab.html.erb
209
+ - app/views/dbwatcher/sessions/_session_header.html.erb
210
+ - app/views/dbwatcher/sessions/_summary_tab.html.erb
211
+ - app/views/dbwatcher/sessions/_tab_navigation.html.erb
212
+ - app/views/dbwatcher/sessions/changes.html.erb
213
+ - app/views/dbwatcher/sessions/components/changes/_filters.html.erb
214
+ - app/views/dbwatcher/sessions/components/changes/_table_list.html.erb
215
+ - app/views/dbwatcher/sessions/diagrams.html.erb
153
216
  - app/views/dbwatcher/sessions/index.html.erb
217
+ - app/views/dbwatcher/sessions/shared/_layout.html.erb
218
+ - app/views/dbwatcher/sessions/shared/_navigation.html.erb
219
+ - app/views/dbwatcher/sessions/shared/_session_header.html.erb
154
220
  - app/views/dbwatcher/sessions/show.html.erb
221
+ - app/views/dbwatcher/sessions/summary.html.erb
222
+ - app/views/dbwatcher/shared/_badge.html.erb
223
+ - app/views/dbwatcher/shared/_data_table.html.erb
224
+ - app/views/dbwatcher/shared/_header.html.erb
225
+ - app/views/dbwatcher/shared/_page_layout.html.erb
226
+ - app/views/dbwatcher/shared/_section_panel.html.erb
227
+ - app/views/dbwatcher/shared/_stats_card.html.erb
228
+ - app/views/dbwatcher/shared/_tab_bar.html.erb
229
+ - app/views/dbwatcher/tables/changes.html.erb
230
+ - app/views/dbwatcher/tables/index.html.erb
231
+ - app/views/dbwatcher/tables/show.html.erb
155
232
  - app/views/layouts/dbwatcher/application.html.erb
233
+ - bin/compile_scss
156
234
  - bin/console
157
235
  - bin/release
158
236
  - bin/setup
@@ -160,9 +238,69 @@ files:
160
238
  - lib/dbwatcher.rb
161
239
  - lib/dbwatcher/configuration.rb
162
240
  - lib/dbwatcher/engine.rb
241
+ - lib/dbwatcher/logging.rb
163
242
  - lib/dbwatcher/middleware.rb
164
243
  - lib/dbwatcher/model_extension.rb
244
+ - lib/dbwatcher/services/analyzers/session_data_processor.rb
245
+ - lib/dbwatcher/services/analyzers/table_summary_builder.rb
246
+ - lib/dbwatcher/services/api/base_api_service.rb
247
+ - lib/dbwatcher/services/api/changes_data_service.rb
248
+ - lib/dbwatcher/services/api/diagram_data_service.rb
249
+ - lib/dbwatcher/services/api/summary_data_service.rb
250
+ - lib/dbwatcher/services/base_service.rb
251
+ - lib/dbwatcher/services/dashboard_data_aggregator.rb
252
+ - lib/dbwatcher/services/diagram_analyzers/base_analyzer.rb
253
+ - lib/dbwatcher/services/diagram_analyzers/foreign_key_analyzer.rb
254
+ - lib/dbwatcher/services/diagram_analyzers/inferred_relationship_analyzer.rb
255
+ - lib/dbwatcher/services/diagram_analyzers/model_association_analyzer.rb
256
+ - lib/dbwatcher/services/diagram_data.rb
257
+ - lib/dbwatcher/services/diagram_data/attribute.rb
258
+ - lib/dbwatcher/services/diagram_data/dataset.rb
259
+ - lib/dbwatcher/services/diagram_data/entity.rb
260
+ - lib/dbwatcher/services/diagram_data/relationship.rb
261
+ - lib/dbwatcher/services/diagram_data/relationship_params.rb
262
+ - lib/dbwatcher/services/diagram_error_handler.rb
263
+ - lib/dbwatcher/services/diagram_generator.rb
264
+ - lib/dbwatcher/services/diagram_strategies/base_diagram_strategy.rb
265
+ - lib/dbwatcher/services/diagram_strategies/class_diagram_strategy.rb
266
+ - lib/dbwatcher/services/diagram_strategies/erd_diagram_strategy.rb
267
+ - lib/dbwatcher/services/diagram_strategies/flowchart_diagram_strategy.rb
268
+ - lib/dbwatcher/services/diagram_system.rb
269
+ - lib/dbwatcher/services/diagram_type_registry.rb
270
+ - lib/dbwatcher/services/mermaid_syntax/base_builder.rb
271
+ - lib/dbwatcher/services/mermaid_syntax/cardinality_mapper.rb
272
+ - lib/dbwatcher/services/mermaid_syntax/class_diagram_builder.rb
273
+ - lib/dbwatcher/services/mermaid_syntax/class_diagram_helper.rb
274
+ - lib/dbwatcher/services/mermaid_syntax/erd_builder.rb
275
+ - lib/dbwatcher/services/mermaid_syntax/flowchart_builder.rb
276
+ - lib/dbwatcher/services/mermaid_syntax/sanitizer.rb
277
+ - lib/dbwatcher/services/mermaid_syntax_builder.rb
278
+ - lib/dbwatcher/services/query_filter_processor.rb
279
+ - lib/dbwatcher/services/table_statistics_collector.rb
280
+ - lib/dbwatcher/sql_logger.rb
165
281
  - lib/dbwatcher/storage.rb
282
+ - lib/dbwatcher/storage/api/base_api.rb
283
+ - lib/dbwatcher/storage/api/concerns/table_analyzer.rb
284
+ - lib/dbwatcher/storage/api/query_api.rb
285
+ - lib/dbwatcher/storage/api/session_api.rb
286
+ - lib/dbwatcher/storage/api/table_api.rb
287
+ - lib/dbwatcher/storage/base_storage.rb
288
+ - lib/dbwatcher/storage/change_processor.rb
289
+ - lib/dbwatcher/storage/concerns/data_normalizer.rb
290
+ - lib/dbwatcher/storage/concerns/error_handler.rb
291
+ - lib/dbwatcher/storage/concerns/timestampable.rb
292
+ - lib/dbwatcher/storage/concerns/validatable.rb
293
+ - lib/dbwatcher/storage/date_helper.rb
294
+ - lib/dbwatcher/storage/errors.rb
295
+ - lib/dbwatcher/storage/file_manager.rb
296
+ - lib/dbwatcher/storage/null_session.rb
297
+ - lib/dbwatcher/storage/query_storage.rb
298
+ - lib/dbwatcher/storage/query_validator.rb
299
+ - lib/dbwatcher/storage/session.rb
300
+ - lib/dbwatcher/storage/session_operations.rb
301
+ - lib/dbwatcher/storage/session_query.rb
302
+ - lib/dbwatcher/storage/session_storage.rb
303
+ - lib/dbwatcher/storage/table_storage.rb
166
304
  - lib/dbwatcher/tracker.rb
167
305
  - lib/dbwatcher/version.rb
168
306
  homepage: https://github.com/patrick204nqh/dbwatcher