ImLazy(ruby)

ImLazy是个人使用的小程序,抽时间在公司写了个ruby版本,未完成

equals_verb

# To change this template, choose Tools | Templates
# and open the template in the editor.
require "SDK/verb"
require "Addins/lexer_condition"

module ImLazy
  class EqualsVerb < Verb
    def initialize
      self.name = "Equals"
    end

    def match?(left, right)
      return left.eql?(right)
    end
  end

  LexerCondition.register_lexer(EqualsVerb.new)
end

extension_subject

# To change this template, choose Tools | Templates
# and open the template in the editor.
require "SDK/subject"
require "Addins/lexer_condition"

module ImLazy
  class ExtensionSubject < Subject
    def initialize
      self.name = "Extension"
    end

    def property (path)
      return File.extname(path)
    end
  end

  LexerCondition.register_lexer(ExtensionSubject.new)
end

lexer_condition

# To change this template, choose Tools | Templates
# and open the template in the editor.
require "SDK/common"
require "Runtime/cache_map"

module ImLazy
  class LexerCondition < Condition
    
    @@lexers = CacheMap.new

    #     LexerCondition.register_lexer(lexer) => nil
    #
    #
    # === Parameters
    # * +lexer+ a subject or verb
    #
    # This method will register a lexer
    #
    def self.register_lexer lexer
      key = lexer.class.name
      logd "lexer [#{key}] is registed"
      @@lexers[key] = lexer
    end

    def initialize
      self.name = "LexerCondition"
    end

    def match? (path, config)
      subject_addin_name = config["subject"]
      verb_addin_name = config["verb"]
      object_value = config["object"]
      return false unless(check_param(subject_addin_name, verb_addin_name))

      subject = @@lexers[subject_addin_name]
      verb = @@lexers[verb_addin_name]
      return false unless(check_param(subject, verb))

      property = subject.property(path)

      result = verb.match?(property, object_value)

      logd "matched : #{property} #{verb.name} #{object_value}" if result
      return result
    end

    def check_param(*params)
      params.each do |param|
        if(param == nil || param == "")
          loge "[#{param}] is empty!"
          return false
        end
      end
    end
  end

  # register this condition addin
  Executor.register_condition LexerCondition.new
end

move_action

# To change this template, choose Tools | Templates
# and open the template in the editor.
require "SDK/common"
require "SDK/action"

module ImLazy
  class MoveAction < Action
    def initialize
      
    end

    def perform(path, config)
      destination = config["TargetValue"]
      File.move(path, destination, true)
    end
  end

  # register this condition addin
  Executor.register_action MoveAction.new
end

addin_info

# To change this template, choose Tools | Templates
# and open the template in the editor.
module ImLazy
  class AddinInfo
    attr_accessor :addin_name
    attr_accessor :config
    def initialize

    end
  end
end

folder

# To change this template, choose Tools | Templates
# and open the template in the editor.

module ImLazy
  class Folder
    attr_accessor :path, :rule_ids
    
    def initialize _path
      self.path = _path
      self.rule_ids = []
    end
  end
end

rule

# To change this template, choose Tools | Templates
# and open the template in the editor.
require 'securerandom'

module ImLazy
  class Rule
    attr_accessor :condition, :action , :guid, :name
    def initialize
      self.guid = SecureRandom.hex(13)
    end
  end
end

cache_map

# To change this template, choose Tools | Templates
# and open the template in the editor.

module ImLazy
  class CacheMap < Hash
    def initialize
      
    end
  end
end

data_storage

# To change this template, choose Tools | Templates
# and open the template in the editor.

require "Data/rule"
require "Data/addin_info"

module ImLazy
  class DataStorage
    attr_accessor :rules, :conditions, :actions, :folders

    def initialize
      self.rules = []
      self.conditions = []
      self.actions = []
      self.folders = []
    end

    def load_test_data
      rule = Rule.new;
      rule.name = "rule 1"
      addin = AddinInfo.new
      addin.addin_name = "ImLazy::LexerCondition";
      addin.config = {
        "subject"=>"ImLazy::ExtensionSubject",
        "verb"=>"ImLazy::EqualsVerb",
        "object"=>".bat"
      }
      rule.condition = addin;
      self.rules.push(rule)

      folder = Folder.new("C:/")
      folder.rule_ids.push rule.guid
      self.folders.push(folder)
    end

    def self.json_create(o)
      new(*o['data'])
    end

    def to_json(*a)
      { 'json_class' => self.class.name, 'data' => [rules] }.to_json(*a)
    end
  end
end

executor

# To change this template, choose Tools | Templates
# and open the template in the editor.
require "Runtime/cache_map"
require "Data/folder"
require "SDK/common"
require "thread"
module ImLazy
  class Executor
    @@conditions = CacheMap.new
    @@actions = CacheMap.new
    @@rules = CacheMap.new
    
    def initialize
      load_addins
    end

    def self.register_rule rule
      key = rule.guid
      logd("rule [#{rule.name}] is registed")
      @@rules[key] = rule
    end

    def self.register_condition addin
      key = addin.class.name
      logd("condition addin [#{key}] is registed")
      @@conditions[key] = addin
    end

    def self.register_action addin
      key = addin.class.name
      logd("action addin [#{key}] is registed")
      @@actions[key] = addin
    end

    def load_addins
      Dir.foreach("Addins") do | path |
        require("Addins/" + path) if File.extname(path) == ".rb"
      end
    end

    def execute (folders)
      logd "executing..."
      folders.each do |folder|
        logd "enumerating folder #{folder.path}"
        Dir.foreach(folder.path) do | path |
          Thread.new do
            folder.rule_ids.each do | rule_id |
              rule = @@rules[rule_id]
              key = rule.condition.addin_name
              config = rule.condition.config
              if @@conditions.has_key?(key)
                if @@conditions[key].match?(path, config)
                  logd "mock action has been performed."
                end
              else
                loge "condition witk key [#{key}] not found!"
              end
            end
          end
        end
      end
      logd "done executing."
    end
  end
end

action

# To change this template, choose Tools | Templates
# and open the template in the editor.

module ImLazy
  class Action
    attr_accessor :name
    
    def initialize
      
    end

    def perform(path, config)

    end
  end
end

common

# To change this template, choose Tools | Templates
# and open the template in the editor.

require "Runtime/executor"
require "SDK/condition"
require "Utils/log"

condition

# To change this template, choose Tools | Templates
# and open the template in the editor.

module ImLazy
  class Condition
    attr_accessor :name

    def initialize
      
    end

    def match? (path, config)
      return false
    end
  end
end

lexer_term

# To change this template, choose Tools | Templates
# and open the template in the editor.

module ImLazy
  class LexerTerm
    attr_accessor :name
    def initialize
      
    end
  end
end

subject

# To change this template, choose Tools | Templates
# and open the template in the editor.
require "SDK/lexer_term"
module ImLazy
  class Subject < LexerTerm
    def initialize
      
    end

    def property (path)
      
    end
  end
end

verb

# To change this template, choose Tools | Templates
# and open the template in the editor.
require "SDK/lexer_term"
module ImLazy
  class Verb < LexerTerm
    def initialize

    end

    def match?(left, right)
      return false
    end
  end
end

log

# To change this template, choose Tools | Templates
# and open the template in the editor.
require "logger"
class Object
  @@logger = Logger.new(STDOUT)
  def logd msg
    @@logger.debug(self.class.name) { msg  }
  end

  def loge msg
    @@logger.error(self.class.name) { msg  }
  end
end

main

# To change this template, choose Tools | Templates
# and open the template in the editor.
require "Runtime/executor"
require "Runtime/data_storage"

module ImLazy
  ds = DataStorage.new
  ds.load_test_data
  
  ds.rules.each do |rule|
    Executor.register_rule(rule)
  end

  exe = Executor.new
  exe.execute ds.folders
end
原文地址:https://www.cnblogs.com/ornithopter/p/3748222.html