motion_blender 0.3.0 → 0.3.1
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +5 -5
- data/.travis.yml +5 -1
- data/lib/motion_blender/analyzer/evaluator.rb +3 -27
- data/lib/motion_blender/analyzer/parser.rb +4 -16
- data/lib/motion_blender/analyzer.rb +2 -2
- data/lib/motion_blender/callbacks.rb +1 -1
- data/lib/motion_blender/collector.rb +76 -0
- data/lib/motion_blender/config.rb +1 -1
- data/lib/motion_blender/dependency_graph.rb +13 -0
- data/lib/motion_blender/ext/runtime.rb +4 -0
- data/lib/motion_blender/ext.rb +2 -4
- data/lib/motion_blender/flag_attribute.rb +23 -0
- data/lib/motion_blender/interpreters/base.rb +34 -0
- data/lib/motion_blender/interpreters/original_interpreter.rb +28 -0
- data/lib/motion_blender/interpreters/requirable.rb +45 -0
- data/lib/motion_blender/interpreters/require_interpreter.rb +34 -0
- data/lib/motion_blender/interpreters/require_relative_interpreter.rb +26 -0
- data/lib/motion_blender/interpreters.rb +1 -0
- data/lib/motion_blender/rake_tasks.rb +8 -0
- data/lib/motion_blender/require.rb +22 -0
- data/lib/motion_blender/source.rb +64 -0
- data/lib/motion_blender/version.rb +1 -1
- data/lib/motion_blender.rb +0 -1
- data/motion/motion_blender/ext/suppressors.rb +10 -0
- data/motion/motion_blender/ext.rb +1 -1
- metadata +15 -6
- data/lib/motion_blender/analyzer/original_finder.rb +0 -26
- data/lib/motion_blender/analyzer/require.rb +0 -75
- data/lib/motion_blender/analyzer/source.rb +0 -52
- data/motion/motion_blender/ext/require_suppressor.rb +0 -15
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 4e0a26f4930010d2e1105308d10fb471cc3e3892
         | 
| 4 | 
            +
              data.tar.gz: f537cd46e5096820fc007f634aa127384a7d9bfe
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: bafb18c7858a0d59a7c341ebc1ed6ae809622b3b86c99d9435e0992cc36cead2e819251249798fbca5db20b162363bb01c45d16332fe150c9cdf463d76fb6a0f
         | 
| 7 | 
            +
              data.tar.gz: 9948b5186e33231b7d286d6b6b9cd013a3ae3c7a008e6954c4cc4ab13a70bb15a5475d14c64bf572088c416524fe0a3fd0ddd8c55c617b42290d468940e2841f
         | 
    
        data/.rubocop.yml
    CHANGED
    
    | @@ -7,14 +7,15 @@ AllCops: | |
| 7 7 | 
             
                - 'db/**/*'
         | 
| 8 8 | 
             
                - 'config/**/*'
         | 
| 9 9 |  | 
| 10 | 
            -
            Lint/Eval:
         | 
| 11 | 
            -
              Exclude:
         | 
| 12 | 
            -
                - 'lib/motion_blender/analyzer/parser.rb'
         | 
| 13 | 
            -
             | 
| 14 10 | 
             
            # Configuration parameters: CountComments.
         | 
| 15 11 | 
             
            Metrics/MethodLength:
         | 
| 16 12 | 
             
              Max: 20
         | 
| 17 13 |  | 
| 14 | 
            +
            # Configuration parameters: CountComments.
         | 
| 15 | 
            +
            Metrics/ModuleLength:
         | 
| 16 | 
            +
              Exclude:
         | 
| 17 | 
            +
                - 'spec/**/*'
         | 
| 18 | 
            +
             | 
| 18 19 | 
             
            Metrics/AbcSize:
         | 
| 19 20 | 
             
              Max: 25
         | 
| 20 21 |  | 
| @@ -64,7 +65,6 @@ Style/MethodDefParentheses: | |
| 64 65 | 
             
            # Configuration parameters: EnforcedStyle, SupportedStyles.
         | 
| 65 66 | 
             
            Style/MethodName:
         | 
| 66 67 | 
             
              Exclude:
         | 
| 67 | 
            -
                - 'lib/motion_blender/analyzer/evaluator.rb'
         | 
| 68 68 | 
             
                - 'motion/motion_blender/**/*.rb'
         | 
| 69 69 |  | 
| 70 70 | 
             
            # Cop supports --auto-correct.
         | 
    
        data/.travis.yml
    CHANGED
    
    
| @@ -1,6 +1,4 @@ | |
| 1 | 
            -
            require 'motion_blender/ | 
| 2 | 
            -
            require 'motion_blender/analyzer/require'
         | 
| 3 | 
            -
            require 'motion_blender/analyzer/original_finder'
         | 
| 1 | 
            +
            require 'motion_blender/collector'
         | 
| 4 2 |  | 
| 5 3 | 
             
            module MotionBlender
         | 
| 6 4 | 
             
              class Analyzer
         | 
| @@ -19,11 +17,9 @@ module MotionBlender | |
| 19 17 |  | 
| 20 18 | 
             
                  def run
         | 
| 21 19 | 
             
                    return if @source.evaluated?
         | 
| 22 | 
            -
             | 
| 23 20 | 
             
                    @source.evaluated!
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                     | 
| 26 | 
            -
                    @requires = extractor.instance_variable_get(:@_args) || []
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                    @requires = Collector.collect_requires(@source)
         | 
| 27 23 | 
             
                    @requires.each do |req|
         | 
| 28 24 | 
             
                      req.trace = @trace
         | 
| 29 25 | 
             
                    end
         | 
| @@ -39,26 +35,6 @@ module MotionBlender | |
| 39 35 | 
             
                    @dynamic = true
         | 
| 40 36 | 
             
                    run
         | 
| 41 37 | 
             
                  end
         | 
| 42 | 
            -
             | 
| 43 | 
            -
                  class Extractor
         | 
| 44 | 
            -
                    def initialize file
         | 
| 45 | 
            -
                      @_file = file
         | 
| 46 | 
            -
                    end
         | 
| 47 | 
            -
             | 
| 48 | 
            -
                    Require::TOKENS.each do |method|
         | 
| 49 | 
            -
                      define_method method do |arg|
         | 
| 50 | 
            -
                        req = Require.new(@_file, method, arg)
         | 
| 51 | 
            -
                        unless req.excluded?
         | 
| 52 | 
            -
                          @_args ||= []
         | 
| 53 | 
            -
                          @_args << req
         | 
| 54 | 
            -
                        end
         | 
| 55 | 
            -
                      end
         | 
| 56 | 
            -
                    end
         | 
| 57 | 
            -
             | 
| 58 | 
            -
                    def __ORIGINAL__
         | 
| 59 | 
            -
                      OriginalFinder.new(@_file).find
         | 
| 60 | 
            -
                    end
         | 
| 61 | 
            -
                  end
         | 
| 62 38 | 
             
                end
         | 
| 63 39 | 
             
              end
         | 
| 64 40 | 
             
            end
         | 
| @@ -1,10 +1,8 @@ | |
| 1 | 
            -
            require 'parser/current'
         | 
| 2 1 | 
             
            require 'active_support'
         | 
| 3 2 | 
             
            require 'active_support/callbacks'
         | 
| 4 3 |  | 
| 5 | 
            -
            require 'motion_blender/analyzer/ | 
| 4 | 
            +
            require 'motion_blender/analyzer/cache'
         | 
| 6 5 | 
             
            require 'motion_blender/analyzer/evaluator'
         | 
| 7 | 
            -
            require 'motion_blender/analyzer/require'
         | 
| 8 6 |  | 
| 9 7 | 
             
            module MotionBlender
         | 
| 10 8 | 
             
              class Analyzer
         | 
| @@ -22,8 +20,7 @@ module MotionBlender | |
| 22 20 | 
             
                  def parse
         | 
| 23 21 | 
             
                    srcs = cache.fetch do
         | 
| 24 22 | 
             
                      run_callbacks :parse do
         | 
| 25 | 
            -
                         | 
| 26 | 
            -
                        ast && traverse(Source.new(ast: ast))
         | 
| 23 | 
            +
                        traverse(Source.parse_file(@file))
         | 
| 27 24 | 
             
                        @evaluators.map(&:source).map(&:attributes)
         | 
| 28 25 | 
             
                      end
         | 
| 29 26 | 
             
                    end
         | 
| @@ -40,9 +37,9 @@ module MotionBlender | |
| 40 37 | 
             
                  end
         | 
| 41 38 |  | 
| 42 39 | 
             
                  def traverse source
         | 
| 43 | 
            -
                    if  | 
| 40 | 
            +
                    if Collector.requirable?(source)
         | 
| 44 41 | 
             
                      evaluate source
         | 
| 45 | 
            -
                    elsif  | 
| 42 | 
            +
                    elsif Collector.acceptable?(source)
         | 
| 46 43 | 
             
                      source.children.each { |src| traverse src }
         | 
| 47 44 | 
             
                    end
         | 
| 48 45 | 
             
                  end
         | 
| @@ -59,15 +56,6 @@ module MotionBlender | |
| 59 56 | 
             
                  def last_trace
         | 
| 60 57 | 
             
                    @evaluators.last.try :trace
         | 
| 61 58 | 
             
                  end
         | 
| 62 | 
            -
             | 
| 63 | 
            -
                  def require_command? source
         | 
| 64 | 
            -
                    source.type.send? && Require.acceptable?(source.method)
         | 
| 65 | 
            -
                  end
         | 
| 66 | 
            -
             | 
| 67 | 
            -
                  def raketime_block? source
         | 
| 68 | 
            -
                    source.type.block? &&
         | 
| 69 | 
            -
                      (source.children.first.code == 'MotionBlender.raketime')
         | 
| 70 | 
            -
                  end
         | 
| 71 59 | 
             
                end
         | 
| 72 60 | 
             
              end
         | 
| 73 61 | 
             
            end
         | 
| @@ -1,11 +1,11 @@ | |
| 1 1 | 
             
            require 'set'
         | 
| 2 2 | 
             
            require 'pathname'
         | 
| 3 | 
            +
            require 'motion_blender/interpreters'
         | 
| 3 4 | 
             
            require 'motion_blender/analyzer/parser'
         | 
| 4 | 
            -
            require 'motion_blender/analyzer/cache'
         | 
| 5 5 |  | 
| 6 6 | 
             
            module MotionBlender
         | 
| 7 7 | 
             
              class Analyzer
         | 
| 8 | 
            -
                attr_reader :files, :dependencies | 
| 8 | 
            +
                attr_reader :files, :dependencies
         | 
| 9 9 |  | 
| 10 10 | 
             
                def initialize
         | 
| 11 11 | 
             
                  @analyzed_files = Set.new
         | 
| @@ -0,0 +1,76 @@ | |
| 1 | 
            +
            require 'motion_blender/source'
         | 
| 2 | 
            +
            require 'motion_blender/require'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module MotionBlender
         | 
| 5 | 
            +
              class Collector
         | 
| 6 | 
            +
                class << self
         | 
| 7 | 
            +
                  def interpreters
         | 
| 8 | 
            +
                    @interpreters ||= []
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def register interpreter
         | 
| 12 | 
            +
                    interpreters << interpreter
         | 
| 13 | 
            +
                    interpreter
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  def requirable? source
         | 
| 17 | 
            +
                    interpreters.each_with_object(source).any?(&:requirable?)
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  def acceptable? source
         | 
| 21 | 
            +
                    !source.type.block? ||
         | 
| 22 | 
            +
                      (source.children.first.code != 'MotionBlender.raketime')
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  def collect_requires source
         | 
| 26 | 
            +
                    collector = new(source, interpreters)
         | 
| 27 | 
            +
                    interpreters.each do |interpreter|
         | 
| 28 | 
            +
                      get_refinement_for(interpreter.receiver).module_eval do
         | 
| 29 | 
            +
                        define_method interpreter.method do |*args, &proc|
         | 
| 30 | 
            +
                          collector.interpreters[interpreter.key].interpret(*args, &proc)
         | 
| 31 | 
            +
                        end
         | 
| 32 | 
            +
                      end
         | 
| 33 | 
            +
                    end
         | 
| 34 | 
            +
                    Object.new.instance_eval(source.code, source.file, source.line)
         | 
| 35 | 
            +
                    collector.requires
         | 
| 36 | 
            +
                  ensure
         | 
| 37 | 
            +
                    clear_refinements
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  private
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  def refinements
         | 
| 43 | 
            +
                    @refinements ||= {}
         | 
| 44 | 
            +
                  end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                  def get_refinement_for klass
         | 
| 47 | 
            +
                    refinements[klass] ||=
         | 
| 48 | 
            +
                      begin
         | 
| 49 | 
            +
                        Module.new do
         | 
| 50 | 
            +
                          klass.prepend self
         | 
| 51 | 
            +
                        end
         | 
| 52 | 
            +
                      end
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  def clear_refinements
         | 
| 56 | 
            +
                    refinements.each do |_, mod|
         | 
| 57 | 
            +
                      mod.module_eval do
         | 
| 58 | 
            +
                        instance_methods.each do |m|
         | 
| 59 | 
            +
                          remove_method m
         | 
| 60 | 
            +
                        end
         | 
| 61 | 
            +
                      end
         | 
| 62 | 
            +
                    end
         | 
| 63 | 
            +
                  end
         | 
| 64 | 
            +
                end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                attr_accessor :source, :interpreters, :requires
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                def initialize source, interpreters
         | 
| 69 | 
            +
                  @source = source
         | 
| 70 | 
            +
                  @interpreters = interpreters.map do |interpreter|
         | 
| 71 | 
            +
                    [interpreter.key, interpreter.new(self)]
         | 
| 72 | 
            +
                  end.to_h
         | 
| 73 | 
            +
                  @requires = []
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
              end
         | 
| 76 | 
            +
            end
         | 
| @@ -10,7 +10,7 @@ module MotionBlender | |
| 10 10 | 
             
                  @incepted_files = []
         | 
| 11 11 | 
             
                  @excepted_files = Set.new
         | 
| 12 12 | 
             
                  @motion_dirs = []
         | 
| 13 | 
            -
                  @builtin_features = Set.new %w(bigdecimal rational date | 
| 13 | 
            +
                  @builtin_features = Set.new %w(bigdecimal rational date)
         | 
| 14 14 | 
             
                  @cache_dir = Pathname.new('build/analyze')
         | 
| 15 15 | 
             
                end
         | 
| 16 16 | 
             
              end
         | 
    
        data/lib/motion_blender/ext.rb
    CHANGED
    
    
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            module MotionBlender
         | 
| 2 | 
            +
              module FlagAttribute
         | 
| 3 | 
            +
                extend ActiveSupport::Concern
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                module ClassMethods
         | 
| 6 | 
            +
                  def flag_attribute *args
         | 
| 7 | 
            +
                    args.each do |attr|
         | 
| 8 | 
            +
                      define_method "#{attr}?" do
         | 
| 9 | 
            +
                        !!instance_variable_get("@#{attr}")
         | 
| 10 | 
            +
                      end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                      define_method "#{attr}!" do
         | 
| 13 | 
            +
                        instance_variable_set "@#{attr}", true
         | 
| 14 | 
            +
                      end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                      define_method "reset_#{attr}!" do
         | 
| 17 | 
            +
                        instance_variable_set "@#{attr}", false
         | 
| 18 | 
            +
                      end
         | 
| 19 | 
            +
                    end
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            require 'motion_blender/collector'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module MotionBlender
         | 
| 4 | 
            +
              module Interpreters
         | 
| 5 | 
            +
                class Base
         | 
| 6 | 
            +
                  class << self
         | 
| 7 | 
            +
                    attr_reader :method, :receiver
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                    def interprets method, options = {}
         | 
| 10 | 
            +
                      @method = method
         | 
| 11 | 
            +
                      @receiver = options[:receiver] || Object
         | 
| 12 | 
            +
                      Collector.register self
         | 
| 13 | 
            +
                    end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                    def key
         | 
| 16 | 
            +
                      [@receiver, @method]
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    def requirable? _
         | 
| 20 | 
            +
                      false
         | 
| 21 | 
            +
                    end
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  attr_reader :collector
         | 
| 25 | 
            +
                  delegate :method, :receiver, to: :class
         | 
| 26 | 
            +
                  delegate :source, :requires, to: :collector
         | 
| 27 | 
            +
                  delegate :file, to: :source
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  def initialize collector
         | 
| 30 | 
            +
                    @collector = collector
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
| @@ -0,0 +1,28 @@ | |
| 1 | 
            +
            require 'motion_blender/interpreters/base'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module MotionBlender
         | 
| 4 | 
            +
              module Interpreters
         | 
| 5 | 
            +
                class OriginalInterpreter < Base
         | 
| 6 | 
            +
                  interprets :__ORIGINAL__
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  attr_reader :original
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  def interpret
         | 
| 11 | 
            +
                    dir = MotionBlender.config.motion_dirs.find { |d| file.start_with? d }
         | 
| 12 | 
            +
                    fail 'not found in motion_dirs' unless dir
         | 
| 13 | 
            +
                    arg = Pathname.new(file).relative_path_from(Pathname.new(dir))
         | 
| 14 | 
            +
                    @original = candidates_for(arg).find(&:file?).try(&:to_s)
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  private
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  def candidates_for arg
         | 
| 20 | 
            +
                    Enumerator.new do |y|
         | 
| 21 | 
            +
                      $LOAD_PATH.each do |dir|
         | 
| 22 | 
            +
                        y << Pathname.new(dir).join(arg)
         | 
| 23 | 
            +
                      end
         | 
| 24 | 
            +
                    end
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
            end
         | 
| @@ -0,0 +1,45 @@ | |
| 1 | 
            +
            module MotionBlender
         | 
| 2 | 
            +
              module Interpreters
         | 
| 3 | 
            +
                module Requirable
         | 
| 4 | 
            +
                  extend ActiveSupport::Concern
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  module ClassMethods
         | 
| 7 | 
            +
                    def requirable? source
         | 
| 8 | 
            +
                      source.type.send? && (source.method == method)
         | 
| 9 | 
            +
                    end
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  def find_require arg
         | 
| 13 | 
            +
                    return if excluded_arg? arg
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                    req = Require.new(file, method, arg)
         | 
| 16 | 
            +
                    req.file = resolve_path req.arg
         | 
| 17 | 
            +
                    return if excluded_file? req.file
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    yield req
         | 
| 20 | 
            +
                    true
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  def resolve_path arg
         | 
| 24 | 
            +
                    path = candidates(arg).find(&:file?)
         | 
| 25 | 
            +
                    fail LoadError, "not found `#{arg}'" unless path
         | 
| 26 | 
            +
                    explicit_relative path
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  private
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  def excluded_arg? arg
         | 
| 32 | 
            +
                    MotionBlender.config.builtin_features.include?(arg) ||
         | 
| 33 | 
            +
                      MotionBlender.config.excepted_files.include?(arg)
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  def excluded_file? file
         | 
| 37 | 
            +
                    MotionBlender.config.excepted_files.include?(file)
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  def explicit_relative path
         | 
| 41 | 
            +
                    path.to_s.sub(%r{^(?![\./])}, './')
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
              end
         | 
| 45 | 
            +
            end
         | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            require 'motion_blender/interpreters/base'
         | 
| 2 | 
            +
            require 'motion_blender/interpreters/requirable'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module MotionBlender
         | 
| 5 | 
            +
              module Interpreters
         | 
| 6 | 
            +
                class RequireInterpreter < Base
         | 
| 7 | 
            +
                  include Requirable
         | 
| 8 | 
            +
                  interprets :require
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  def interpret arg
         | 
| 11 | 
            +
                    find_require(arg) do |req|
         | 
| 12 | 
            +
                      requires << req
         | 
| 13 | 
            +
                    end
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  def candidates arg
         | 
| 17 | 
            +
                    path = Pathname.new(arg)
         | 
| 18 | 
            +
                    dirs = path.relative? && load_path || ['']
         | 
| 19 | 
            +
                    exts = path.extname.empty? ? ['', '.rb'] : ['']
         | 
| 20 | 
            +
                    Enumerator.new do |y|
         | 
| 21 | 
            +
                      dirs.product(exts).each do |dir, ext|
         | 
| 22 | 
            +
                        y << Pathname.new(dir).join("#{path}#{ext}")
         | 
| 23 | 
            +
                      end
         | 
| 24 | 
            +
                    end
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  private
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  def load_path
         | 
| 30 | 
            +
                    MotionBlender.config.motion_dirs + $LOAD_PATH
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
| @@ -0,0 +1,26 @@ | |
| 1 | 
            +
            require 'motion_blender/interpreters/base'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module MotionBlender
         | 
| 4 | 
            +
              module Interpreters
         | 
| 5 | 
            +
                class RequireRelativeInterpreter < Base
         | 
| 6 | 
            +
                  include Requirable
         | 
| 7 | 
            +
                  interprets :require_relative
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  def interpret arg
         | 
| 10 | 
            +
                    find_require(arg) do |req|
         | 
| 11 | 
            +
                      requires << req
         | 
| 12 | 
            +
                    end
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  def candidates arg
         | 
| 16 | 
            +
                    path = Pathname.new(file).dirname.join(arg)
         | 
| 17 | 
            +
                    exts = path.extname.empty? ? ['', '.rb'] : ['']
         | 
| 18 | 
            +
                    Enumerator.new do |y|
         | 
| 19 | 
            +
                      exts.each do |ext|
         | 
| 20 | 
            +
                        y << Pathname.new("#{path}#{ext}")
         | 
| 21 | 
            +
                      end
         | 
| 22 | 
            +
                    end
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
            end
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            Dir[File.expand_path('../interpreters/*.rb', __FILE__)].each { |f| require f }
         | 
| @@ -3,6 +3,7 @@ require 'yaml' | |
| 3 3 | 
             
            require 'motion_blender/config'
         | 
| 4 4 | 
             
            require 'motion_blender/analyzer'
         | 
| 5 5 | 
             
            require 'motion_blender/graph_maker'
         | 
| 6 | 
            +
            require 'motion_blender/dependency_graph'
         | 
| 6 7 |  | 
| 7 8 | 
             
            module MotionBlender
         | 
| 8 9 | 
             
              class RakeTasks
         | 
| @@ -21,6 +22,7 @@ module MotionBlender | |
| 21 22 |  | 
| 22 23 | 
             
                def apply
         | 
| 23 24 | 
             
                  analyzer = analyze
         | 
| 25 | 
            +
                  verify_dependencies analyzer.dependencies
         | 
| 24 26 | 
             
                  Motion::Project::App.setup do |app|
         | 
| 25 27 | 
             
                    new_files = analyzer.files - app.files
         | 
| 26 28 | 
             
                    app.exclude_from_detect_dependencies += new_files
         | 
| @@ -42,6 +44,12 @@ module MotionBlender | |
| 42 44 | 
             
                  graph_maker.build
         | 
| 43 45 | 
             
                  Motion::Project::App.info('Create', graph_maker.output)
         | 
| 44 46 | 
             
                end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                private
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                def verify_dependencies hash
         | 
| 51 | 
            +
                  DependencyGraph[hash].tsort
         | 
| 52 | 
            +
                end
         | 
| 45 53 | 
             
              end
         | 
| 46 54 | 
             
            end
         | 
| 47 55 |  | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            require 'active_support'
         | 
| 2 | 
            +
            require 'active_support/callbacks'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module MotionBlender
         | 
| 5 | 
            +
              class Require
         | 
| 6 | 
            +
                include ActiveSupport::Callbacks
         | 
| 7 | 
            +
                define_callbacks :require
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                attr_reader :loader, :method, :arg
         | 
| 10 | 
            +
                attr_accessor :trace, :file
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                def initialize loader, method, arg
         | 
| 13 | 
            +
                  @loader = loader
         | 
| 14 | 
            +
                  @method = method
         | 
| 15 | 
            +
                  @arg = arg
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                def match? arg_or_file
         | 
| 19 | 
            +
                  [arg, file].compact.include?(arg_or_file)
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
            end
         | 
| @@ -0,0 +1,64 @@ | |
| 1 | 
            +
            require 'parser/current'
         | 
| 2 | 
            +
            require 'motion_blender/flag_attribute'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module MotionBlender
         | 
| 5 | 
            +
              class Source
         | 
| 6 | 
            +
                def self.parse code, attrs = {}
         | 
| 7 | 
            +
                  attrs[:ast] = ::Parser::CurrentRuby.parse(code)
         | 
| 8 | 
            +
                  new(attrs)
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                def self.parse_file file
         | 
| 12 | 
            +
                  ast = ::Parser::CurrentRuby.parse_file(file)
         | 
| 13 | 
            +
                  new(ast: ast)
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                include FlagAttribute
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                attr_reader :code, :file, :line, :parent, :type, :method, :ast
         | 
| 19 | 
            +
                flag_attribute :evaluated
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                def initialize attrs = {}
         | 
| 22 | 
            +
                  @evaluated = false
         | 
| 23 | 
            +
                  ast = attrs.delete :ast
         | 
| 24 | 
            +
                  if ast
         | 
| 25 | 
            +
                    @code = ast.loc.expression.try(:source)
         | 
| 26 | 
            +
                    @file = ast.loc.expression.try(:source_buffer).try(:name)
         | 
| 27 | 
            +
                    @line = ast.loc.expression.try(:line)
         | 
| 28 | 
            +
                    @type = ast.type.to_s.inquiry
         | 
| 29 | 
            +
                    @method = @type.send? ? ast.children[1] : nil
         | 
| 30 | 
            +
                    @ast = ast
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                  attrs.each do |k, v|
         | 
| 33 | 
            +
                    instance_variable_set "@#{k}", v
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
                  @type = @type.to_s.inquiry
         | 
| 36 | 
            +
                  @method = @method.try(:to_sym)
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                def to_s
         | 
| 40 | 
            +
                  "#{file}:#{line}:in `#{method || type}'"
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                def children
         | 
| 44 | 
            +
                  @children ||=
         | 
| 45 | 
            +
                    if @ast
         | 
| 46 | 
            +
                      @ast.children.grep(::Parser::AST::Node).map do |ast|
         | 
| 47 | 
            +
                        Source.new(ast: ast, parent: self)
         | 
| 48 | 
            +
                      end
         | 
| 49 | 
            +
                    else
         | 
| 50 | 
            +
                      []
         | 
| 51 | 
            +
                    end
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                def attributes
         | 
| 55 | 
            +
                  {
         | 
| 56 | 
            +
                    'code' => @code,
         | 
| 57 | 
            +
                    'file' => @file,
         | 
| 58 | 
            +
                    'line' => @line,
         | 
| 59 | 
            +
                    'type' => @type.to_s,
         | 
| 60 | 
            +
                    'method' => @method.try(:to_s)
         | 
| 61 | 
            +
                  }
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
              end
         | 
| 64 | 
            +
            end
         | 
    
        data/lib/motion_blender.rb
    CHANGED
    
    
| @@ -1,2 +1,2 @@ | |
| 1 1 | 
             
            require 'motion_blender/ext/runtime'
         | 
| 2 | 
            -
            require 'motion_blender/ext/ | 
| 2 | 
            +
            require 'motion_blender/ext/suppressors'
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: motion_blender
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.3. | 
| 4 | 
            +
              version: 0.3.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - kayhide
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2016-02- | 
| 11 | 
            +
            date: 2016-02-09 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: parser
         | 
| @@ -257,20 +257,29 @@ files: | |
| 257 257 | 
             
            - lib/motion_blender/analyzer.rb
         | 
| 258 258 | 
             
            - lib/motion_blender/analyzer/cache.rb
         | 
| 259 259 | 
             
            - lib/motion_blender/analyzer/evaluator.rb
         | 
| 260 | 
            -
            - lib/motion_blender/analyzer/original_finder.rb
         | 
| 261 260 | 
             
            - lib/motion_blender/analyzer/parser.rb
         | 
| 262 | 
            -
            - lib/motion_blender/analyzer/require.rb
         | 
| 263 | 
            -
            - lib/motion_blender/analyzer/source.rb
         | 
| 264 261 | 
             
            - lib/motion_blender/callbacks.rb
         | 
| 262 | 
            +
            - lib/motion_blender/collector.rb
         | 
| 265 263 | 
             
            - lib/motion_blender/config.rb
         | 
| 264 | 
            +
            - lib/motion_blender/dependency_graph.rb
         | 
| 266 265 | 
             
            - lib/motion_blender/ext.rb
         | 
| 267 266 | 
             
            - lib/motion_blender/ext/raketime.rb
         | 
| 267 | 
            +
            - lib/motion_blender/ext/runtime.rb
         | 
| 268 | 
            +
            - lib/motion_blender/flag_attribute.rb
         | 
| 268 269 | 
             
            - lib/motion_blender/graph_maker.rb
         | 
| 270 | 
            +
            - lib/motion_blender/interpreters.rb
         | 
| 271 | 
            +
            - lib/motion_blender/interpreters/base.rb
         | 
| 272 | 
            +
            - lib/motion_blender/interpreters/original_interpreter.rb
         | 
| 273 | 
            +
            - lib/motion_blender/interpreters/requirable.rb
         | 
| 274 | 
            +
            - lib/motion_blender/interpreters/require_interpreter.rb
         | 
| 275 | 
            +
            - lib/motion_blender/interpreters/require_relative_interpreter.rb
         | 
| 269 276 | 
             
            - lib/motion_blender/rake_tasks.rb
         | 
| 277 | 
            +
            - lib/motion_blender/require.rb
         | 
| 278 | 
            +
            - lib/motion_blender/source.rb
         | 
| 270 279 | 
             
            - lib/motion_blender/version.rb
         | 
| 271 280 | 
             
            - motion/motion_blender/ext.rb
         | 
| 272 | 
            -
            - motion/motion_blender/ext/require_suppressor.rb
         | 
| 273 281 | 
             
            - motion/motion_blender/ext/runtime.rb
         | 
| 282 | 
            +
            - motion/motion_blender/ext/suppressors.rb
         | 
| 274 283 | 
             
            - motion_blender.gemspec
         | 
| 275 284 | 
             
            homepage: https://github.com/kayhide/motion_blender
         | 
| 276 285 | 
             
            licenses:
         | 
| @@ -1,26 +0,0 @@ | |
| 1 | 
            -
            module MotionBlender
         | 
| 2 | 
            -
              class Analyzer
         | 
| 3 | 
            -
                class OriginalFinder
         | 
| 4 | 
            -
                  attr_reader :file, :original
         | 
| 5 | 
            -
             | 
| 6 | 
            -
                  def initialize file
         | 
| 7 | 
            -
                    @file = file
         | 
| 8 | 
            -
                  end
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                  def find
         | 
| 11 | 
            -
                    dir = MotionBlender.config.motion_dirs.find { |d| @file.start_with? d }
         | 
| 12 | 
            -
                    fail 'not found in motion_dirs' unless dir
         | 
| 13 | 
            -
                    arg = Pathname.new(@file).relative_path_from(Pathname.new(dir))
         | 
| 14 | 
            -
                    @original = candidates_for(arg).find(&:file?).try(&:to_s)
         | 
| 15 | 
            -
                  end
         | 
| 16 | 
            -
             | 
| 17 | 
            -
                  def candidates_for arg
         | 
| 18 | 
            -
                    Enumerator.new do |y|
         | 
| 19 | 
            -
                      $LOAD_PATH.each do |dir|
         | 
| 20 | 
            -
                        y << Pathname.new(dir).join(arg)
         | 
| 21 | 
            -
                      end
         | 
| 22 | 
            -
                    end
         | 
| 23 | 
            -
                  end
         | 
| 24 | 
            -
                end
         | 
| 25 | 
            -
              end
         | 
| 26 | 
            -
            end
         | 
| @@ -1,75 +0,0 @@ | |
| 1 | 
            -
            require 'active_support'
         | 
| 2 | 
            -
            require 'active_support/callbacks'
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            module MotionBlender
         | 
| 5 | 
            -
              class Analyzer
         | 
| 6 | 
            -
                class Require
         | 
| 7 | 
            -
                  include ActiveSupport::Callbacks
         | 
| 8 | 
            -
                  define_callbacks :require
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                  TOKENS = %i(motion_require require_relative require)
         | 
| 11 | 
            -
             | 
| 12 | 
            -
                  attr_accessor :loader, :method, :arg, :trace
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                  def initialize loader, method, arg
         | 
| 15 | 
            -
                    @loader = loader
         | 
| 16 | 
            -
                    @method = method
         | 
| 17 | 
            -
                    @arg = arg
         | 
| 18 | 
            -
                  end
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                  def file
         | 
| 21 | 
            -
                    @file ||= resolve_path
         | 
| 22 | 
            -
                  end
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                  def resolve_path
         | 
| 25 | 
            -
                    path = candidates.find(&:file?)
         | 
| 26 | 
            -
                    fail LoadError, "not found `#{arg}'" unless path
         | 
| 27 | 
            -
                    explicit_relative path
         | 
| 28 | 
            -
                  end
         | 
| 29 | 
            -
             | 
| 30 | 
            -
                  def candidates
         | 
| 31 | 
            -
                    path =
         | 
| 32 | 
            -
                      if %i(motion_require require_relative).include? method
         | 
| 33 | 
            -
                        Pathname.new(loader).dirname.join(arg)
         | 
| 34 | 
            -
                      else
         | 
| 35 | 
            -
                        Pathname.new(arg)
         | 
| 36 | 
            -
                      end
         | 
| 37 | 
            -
                    dirs = path.relative? && load_path || ['']
         | 
| 38 | 
            -
                    exts = path.extname.empty? ? ['', '.rb'] : ['']
         | 
| 39 | 
            -
                    Enumerator.new do |y|
         | 
| 40 | 
            -
                      dirs.product(exts).each do |dir, ext|
         | 
| 41 | 
            -
                        y << Pathname.new(dir).join("#{path}#{ext}")
         | 
| 42 | 
            -
                      end
         | 
| 43 | 
            -
                    end
         | 
| 44 | 
            -
                  end
         | 
| 45 | 
            -
             | 
| 46 | 
            -
                  def explicit_relative path
         | 
| 47 | 
            -
                    path.to_s.sub(%r{^(?![\./])}, './')
         | 
| 48 | 
            -
                  end
         | 
| 49 | 
            -
             | 
| 50 | 
            -
                  def uses_load_path?
         | 
| 51 | 
            -
                    method == :require
         | 
| 52 | 
            -
                  end
         | 
| 53 | 
            -
             | 
| 54 | 
            -
                  def load_path
         | 
| 55 | 
            -
                    if uses_load_path?
         | 
| 56 | 
            -
                      MotionBlender.config.motion_dirs + $LOAD_PATH
         | 
| 57 | 
            -
                    end
         | 
| 58 | 
            -
                  end
         | 
| 59 | 
            -
             | 
| 60 | 
            -
                  def match? arg_or_file
         | 
| 61 | 
            -
                    arg == arg_or_file || file == arg_or_file
         | 
| 62 | 
            -
                  end
         | 
| 63 | 
            -
             | 
| 64 | 
            -
                  def excluded?
         | 
| 65 | 
            -
                    MotionBlender.config.builtin_features.include?(arg) ||
         | 
| 66 | 
            -
                      MotionBlender.config.excepted_files.include?(arg) ||
         | 
| 67 | 
            -
                      MotionBlender.config.excepted_files.include?(file)
         | 
| 68 | 
            -
                  end
         | 
| 69 | 
            -
             | 
| 70 | 
            -
                  def self.acceptable? method
         | 
| 71 | 
            -
                    TOKENS.include?(method)
         | 
| 72 | 
            -
                  end
         | 
| 73 | 
            -
                end
         | 
| 74 | 
            -
              end
         | 
| 75 | 
            -
            end
         | 
| @@ -1,52 +0,0 @@ | |
| 1 | 
            -
            module MotionBlender
         | 
| 2 | 
            -
              class Analyzer
         | 
| 3 | 
            -
                class Source
         | 
| 4 | 
            -
                  attr_reader :code, :file, :line, :parent, :type, :method, :ast
         | 
| 5 | 
            -
                  attr_reader :evaluated
         | 
| 6 | 
            -
                  alias_method :evaluated?, :evaluated
         | 
| 7 | 
            -
             | 
| 8 | 
            -
                  def initialize attrs = {}
         | 
| 9 | 
            -
                    @evaluated = false
         | 
| 10 | 
            -
                    ast = attrs.delete :ast
         | 
| 11 | 
            -
                    if ast
         | 
| 12 | 
            -
                      @code = ast.loc.expression.try(:source)
         | 
| 13 | 
            -
                      @file = ast.loc.expression.try(:source_buffer).try(:name)
         | 
| 14 | 
            -
                      @line = ast.loc.expression.try(:line)
         | 
| 15 | 
            -
                      @type = ast.type.to_s.inquiry
         | 
| 16 | 
            -
                      @method = @type.send? ? ast.children[1] : nil
         | 
| 17 | 
            -
                      @ast = ast
         | 
| 18 | 
            -
                    end
         | 
| 19 | 
            -
                    attrs.each do |k, v|
         | 
| 20 | 
            -
                      instance_variable_set "@#{k}", v
         | 
| 21 | 
            -
                    end
         | 
| 22 | 
            -
                    @type = @type.to_s.inquiry
         | 
| 23 | 
            -
                    @method = @method.try(:to_sym)
         | 
| 24 | 
            -
                  end
         | 
| 25 | 
            -
             | 
| 26 | 
            -
                  def evaluated!
         | 
| 27 | 
            -
                    @evaluated = true
         | 
| 28 | 
            -
                  end
         | 
| 29 | 
            -
             | 
| 30 | 
            -
                  def children
         | 
| 31 | 
            -
                    @children ||=
         | 
| 32 | 
            -
                      if @ast
         | 
| 33 | 
            -
                        @ast.children.grep(::Parser::AST::Node).map do |ast|
         | 
| 34 | 
            -
                          Source.new(ast: ast, parent: self)
         | 
| 35 | 
            -
                        end
         | 
| 36 | 
            -
                      else
         | 
| 37 | 
            -
                        []
         | 
| 38 | 
            -
                      end
         | 
| 39 | 
            -
                  end
         | 
| 40 | 
            -
             | 
| 41 | 
            -
                  def attributes
         | 
| 42 | 
            -
                    {
         | 
| 43 | 
            -
                      'code' => @code,
         | 
| 44 | 
            -
                      'file' => @file,
         | 
| 45 | 
            -
                      'line' => @line,
         | 
| 46 | 
            -
                      'type' => @type.to_s,
         | 
| 47 | 
            -
                      'method' => @method.try(:to_s)
         | 
| 48 | 
            -
                    }
         | 
| 49 | 
            -
                  end
         | 
| 50 | 
            -
                end
         | 
| 51 | 
            -
              end
         | 
| 52 | 
            -
            end
         |