<commit_before>module Buildr
  module ShellProviders
    class << self
      def add(p)
        @providers ||= {}
        
        if p.lang == :none
          @providers[:none] ||= []
          @providers[:none] << p
        else
          @providers[p.lang] = p
        end
      end
      alias :<< :add
      
      def providers
        @providers ||= {}
      end
      
      def each
        providers.each do |lang, p|
          if lang == :none
            p.each do |x|
              yield x
            end
          else
            yield p
          end
        end
      end
    end
  end
  
  module Shell
    class Base
      attr_reader :project
      
      class << self
        def lang
          :none
        end
        
        def to_sym
          @symbol ||= name.split('::').last.downcase.to_sym
        end
      end
      
      def initialize(project)
        @project = project
      end
      
      def launch
        fail 'Not implemented'
      end
    end
    
    module JavaRebel
      def rebel_home
        unless @rebel_home
          @rebel_home = ENV['REBEL_HOME'] or ENV['JAVA_REBEL'] or ENV['JAVAREBEL'] or ENV['JAVAREBEL_HOME']
          
          if @rebel_home and File.directory? @rebel_home
            @rebel_home += File::SEPARATOR + 'javarebel.jar'
          end
        end
        
        if @rebel_home and File.exists? @rebel_home
          @rebel_home
        else
          nil
        end
      end
      
      def rebel_args
        if rebel_home
          [
            '-noverify',
            "-javaagent:#{rebel_home}"
          ]
        else
          []
        end
      end
      
      def rebel_props(project)
        if rebel_home
          { 'rebel.dirs' => project.path_to(:target, :classes) }
        else
          {}
        end
      end
    end
  end
  
  module ShellExtension
    include Extension
    
    first_time do
      Project.local_task 'shell'
      
      ShellProviders.each { |p| Project.local_task "shell:#{p.to_sym}" }    # TODO  not working
    end
    
    before_define do |project|
      ShellProviders.each do |p|
        name = p.to_sym
        
        trace "Defining task #{project.name}:shell:#{name}"
        project.task "shell:#{name}" => :compile do
          trace "Launching #{name} shell"
          p.new(project).launch
        end
      end
    end
    
    after_define do |project|
      default_shell = project.shell.using
      
      if default_shell
        dep = "shell:#{default_shell.to_sym}"
        
        trace "Defining task shell based on #{dep}"
        project.task :shell => dep
      else
        project.task :shell do
          fail "No shell provider defined for language '#{project.compile.language}'"
        end
      end
    end
    
    class ShellConfig
      def initialize(project)
        @project = project
      end
      
      def using(*args)
        if args.size > 0
          @using ||= args.first
        else
          @using ||= find_shell_task
        end
      end
      
    private
      def find_shell_task
        lang = @project.compile.language
        ShellProviders.providers[lang]
      end
    end
    
    # TODO  temporary hack
    def shell
      @shell ||= ShellConfig.new self
    end
  end
  
  class Project
    include ShellExtension
  end
end
<commit_msg>The rebel.dirs property is no longer required<commit_after>module Buildr
  module ShellProviders
    class << self
      def add(p)
        @providers ||= {}
        
        if p.lang == :none
          @providers[:none] ||= []
          @providers[:none] << p
        else
          @providers[p.lang] = p
        end
      end
      alias :<< :add
      
      def providers
        @providers ||= {}
      end
      
      def each
        providers.each do |lang, p|
          if lang == :none
            p.each do |x|
              yield x
            end
          else
            yield p
          end
        end
      end
    end
  end
  
  module Shell
    class Base
      attr_reader :project
      
      class << self
        def lang
          :none
        end
        
        def to_sym
          @symbol ||= name.split('::').last.downcase.to_sym
        end
      end
      
      def initialize(project)
        @project = project
      end
      
      def launch
        fail 'Not implemented'
      end
    end
    
    module JavaRebel
      def rebel_home
        unless @rebel_home
          @rebel_home = ENV['REBEL_HOME'] or ENV['JAVA_REBEL'] or ENV['JAVAREBEL'] or ENV['JAVAREBEL_HOME']
          
          if @rebel_home and File.directory? @rebel_home
            @rebel_home += File::SEPARATOR + 'javarebel.jar'
          end
        end
        
        if @rebel_home and File.exists? @rebel_home
          @rebel_home
        else
          nil
        end
      end
      
      def rebel_args
        if rebel_home
          [
            '-noverify',
            "-javaagent:#{rebel_home}"
          ]
        else
          []
        end
      end
      
      def rebel_props(project)
        {}
      end
    end
  end
  
  module ShellExtension
    include Extension
    
    first_time do
      Project.local_task 'shell'
      
      ShellProviders.each { |p| Project.local_task "shell:#{p.to_sym}" }    # TODO  not working
    end
    
    before_define do |project|
      ShellProviders.each do |p|
        name = p.to_sym
        
        trace "Defining task #{project.name}:shell:#{name}"
        project.task "shell:#{name}" => :compile do
          trace "Launching #{name} shell"
          p.new(project).launch
        end
      end
    end
    
    after_define do |project|
      default_shell = project.shell.using
      
      if default_shell
        dep = "shell:#{default_shell.to_sym}"
        
        trace "Defining task shell based on #{dep}"
        project.task :shell => dep
      else
        project.task :shell do
          fail "No shell provider defined for language '#{project.compile.language}'"
        end
      end
    end
    
    class ShellConfig
      def initialize(project)
        @project = project
      end
      
      def using(*args)
        if args.size > 0
          @using ||= args.first
        else
          @using ||= find_shell_task
        end
      end
      
    private
      def find_shell_task
        lang = @project.compile.language
        ShellProviders.providers[lang]
      end
    end
    
    # TODO  temporary hack
    def shell
      @shell ||= ShellConfig.new self
    end
  end
  
  class Project
    include ShellExtension
  end
end

{'fraction_non_alphanumeric': 0.0794661813770094, 'fraction_numerical': 0.00030330603579011223, 'mean_word_length': 1.3221830985915493, 'pattern_counts': {'":': 0, '<': 19, '<?xml version=': 0, '>': 10, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '724665', 'n_tokens_mistral': 1931, 'n_tokens_neox': 1928, 'n_words': 501}