lib/deforest.rb in deforest-0.0.1 vs lib/deforest.rb in deforest-1.0.0
- old
+ new
@@ -2,22 +2,18 @@
require "deforest/version"
require "active_support"
require "active_record"
module Deforest
- mattr_accessor :write_logs_to_db_every, :current_admin_method_name, :most_used_percentile_threshold, :least_used_percentile_threshold
+ mattr_accessor :write_logs_to_db_every, :current_admin_method_name, :most_used_percentile_threshold, :least_used_percentile_threshold, :track_dirs, :render_source_on_browser
@@last_saved_log_file_at = nil
@@saving_log_file = false
- def self.initialize!
- if block_given?
- yield self
- end
- self.initialize_db_sync_file()
- Dir["#{Rails.root}/app/models/**/*.rb"].map do |f|
- idx = f.index("app/models")
- models_heirarchy = f[idx..-1].gsub("app/models/","")
+ def self.get_app_classes(dir)
+ Dir["#{Rails.root}#{dir}/**/*.rb"].each do |f|
+ idx = f.index(dir)
+ models_heirarchy = f[idx..-1].gsub(dir,"")
exec_str = ""
loop do
parent, *children = models_heirarchy.split("/")
if children.any?
exec_str += "#{parent.camelize}::"
@@ -27,63 +23,83 @@
end
models_heirarchy = children.join("/")
end
begin
model = exec_str.constantize
+ yield model
rescue
puts "Deforest warning: could not track #{exec_str}"
end
- if model.present?
- model.instance_methods(false).each do |mname|
- model.instance_eval do
- alias_method "old_#{mname}", mname
- define_method mname do |*args, &block|
- old_method = self.class.instance_method("old_#{mname}")
- file_name, line_no = old_method.source_location
- if file_name.include?("/app/models")
- Deforest.insert_into_logs(mname, file_name, line_no)
- end
- Deforest.insert_into_logs(mname, file_name, line_no)
- if @@last_saved_log_file_at < Deforest.write_logs_to_db_every.ago && !@@saving_log_file
- Deforest.parse_and_save_log_file()
- t = Time.zone.now
- @@last_saved_log_file_at = t
- File.open("deforest_db_sync.txt", "w") { |fl| fl.write(t.to_i) }
- end
- old_method.bind(self).call(*args, &block)
- end
+ end
+ end
+
+ def self.override_instance_methods_for(klass, dir)
+ klass.instance_methods(false).each do |mname|
+ klass.instance_eval do
+ alias_method "old_#{mname}", mname
+ define_method mname do |*args, &block|
+ old_method = self.class.instance_method("old_#{mname}")
+ file_name, line_no = old_method.source_location
+ if file_name.include?(dir)
+ Deforest.insert_into_logs(mname, file_name, line_no)
end
- end
- model.singleton_methods(false).each do |mname|
- model.singleton_class.send(:alias_method, "old_#{mname}", mname)
- model.define_singleton_method mname do |*args, &block|
- old_method = self.singleton_method("old_#{mname}")
- file_name, line_no = old_method.source_location
- if file_name.include?("/app/models")
- Deforest.insert_into_logs(mname, file_name, line_no)
- end
- if @@last_saved_log_file_at < Deforest.write_logs_to_db_every.ago && !@@saving_log_file
- Deforest.parse_and_save_log_file()
- t = Time.zone.now
- @@last_saved_log_file_at = t
- File.open("deforest_db_sync.txt", "w") { |fl| fl.write(t.to_i) }
- end
- old_method.unbind.bind(self).call(*args, &block)
+ if @@last_saved_log_file_at < Deforest.write_logs_to_db_every.ago && !@@saving_log_file
+ Deforest.parse_and_save_log_file()
+ t = Time.zone.now
+ @@last_saved_log_file_at = t
+ File.open("deforest_db_sync.txt", "w") { |fl| fl.write(t.to_i) }
end
+ old_method.bind(self).call(*args, &block)
+ end
+ end
+ end
+ end
+
+ def self.override_class_methods_for(klass, dir)
+ klass.singleton_methods(false).each do |mname|
+ klass.singleton_class.send(:alias_method, "old_#{mname}", mname)
+ klass.define_singleton_method mname do |*args, &block|
+ old_method = self.singleton_method("old_#{mname}")
+ file_name, line_no = old_method.source_location
+ if file_name.include?(dir)
+ Deforest.insert_into_logs(mname, file_name, line_no)
end
+ if @@last_saved_log_file_at < Deforest.write_logs_to_db_every.ago && !@@saving_log_file
+ Deforest.parse_and_save_log_file()
+ t = Time.zone.now
+ @@last_saved_log_file_at = t
+ File.open("deforest_db_sync.txt", "w") { |fl| fl.write(t.to_i) }
+ end
+ old_method.unbind.bind(self).call(*args, &block)
end
end
end
+
+ def self.initialize!
+ if block_given?
+ yield self
+ end
+ self.initialize_db_sync_file()
+ Deforest.track_dirs.each do |dir|
+ self.get_app_classes(dir) do |model|
+ if model.present?
+ self.override_instance_methods_for(model, dir)
+ self.override_class_methods_for(model, dir) unless dir.include?("/app/controllers")
+ end
+ end
+ end
+ end
def self.initialize_db_sync_file
- if File.exists?("deforest_db_sync.txt")
+ File.open("deforest.log", "w") unless File.exist?("deforest.log")
+ if File.exist?("deforest_db_sync.txt")
@@last_saved_log_file_at = Time.at(File.open("deforest_db_sync.txt").read.to_i)
else
File.open("deforest_db_sync.txt", "w") do |f|
- current_time = Time.zone.now.to_i
+ current_time = Time.zone.now
@@last_saved_log_file_at = current_time
- f.write(current_time)
+ f.write(current_time.to_i)
end
end
end
def self.insert_into_logs(method_name, file_name, line_no)
@@ -105,19 +121,22 @@
else
hash[line] = 1
end
end
hash.each do |loc, count|
- sql_stmt += "(#{loc.split("|").map { |s| "'#{s}'" }.join(",")}, #{count}, current_timestamp, current_timestamp),"
+ t = Time.zone.now
+ sql_stmt += "(#{loc.split("|").map { |s| "'#{s}'" }.join(",")}, #{count}, '#{t}', '#{t}'),"
end
sql_stmt.chomp!(",")
sql_stmt += ";"
- ActiveRecord::Base.connection.execute(sql_stmt)
- if File.exists?("deforest_tmp.log")
- File.delete("deforest.log")
- File.rename("deforest_tmp.log", "deforest.log")
- else
- File.delete("deforest.log")
+ if hash.present?
+ ActiveRecord::Base.connection.execute(sql_stmt)
+ if File.exist?("deforest_tmp.log")
+ File.delete("deforest.log")
+ File.rename("deforest_tmp.log", "deforest.log")
+ else
+ File.delete("deforest.log")
+ end
end
@@saving_log_file = false
end
def self.prepare_file_for_render(file)
\ No newline at end of file