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