File: Rakefile

package info (click to toggle)
ruby-morpher 0.2.6-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 520 kB
  • sloc: ruby: 2,366; makefile: 4
file content (95 lines) | stat: -rw-r--r-- 2,690 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
require 'devtools'
Devtools.init_rake_tasks

Rake.application.load_imports
task('metrics:mutant').clear
namespace :metrics do
  task mutant: :coverage do
    success = Kernel.system(*%w[
      bundle exec mutant
      --zombie
      --use rspec
      --include lib
      --require morpher
      --since HEAD~1
      --
      Morpher*
    ]) or fail 'Mutant task is not successful'
  end
end

# NOTICE: This uses private interface of morpher that can change at any time.
# Its just a placeholder for a better reflection technique!!!
namespace :morpher do
  desc 'List morpher nodes'
  task :list do

    class Presenter

      class Evaluator < self
        include Concord::Public.new(:name, :evaluator)

        def arity
          emitter = Morpher::Compiler::Evaluator::DEFAULT.send(:emitter, evaluator)
          emitter_ns = Morpher::Compiler::Evaluator::Emitter

          {
            emitter_ns::Nullary => :nullary,
            emitter_ns::Nullary::Parameterized => :nullary_param,
            emitter_ns::Unary => :unary,
            emitter_ns::Binary => :binary,
            emitter_ns::Nary => :nary
          }.fetch(emitter)
        end

        def transitivity
          ancestors = evaluator.ancestors
          if ancestors.include?(Morpher::Evaluator::Transformer::Transitive)
            :yes
          elsif ancestors.include?(Morpher::Evaluator::Transformer::Intransitive)
            :no
          else
            :dynamic
          end
        end

        def role
          if evaluator.ancestors.include?(Morpher::Evaluator::Transformer)
            :transforming
          else
            :predicate
          end
        end

      end

      class Preprocessor
        include Concord::Public.new(:name, :emitter)

        def children_nodes
          emitter.allocate.send(:named_children).join(', ')
        end
      end

    end

    puts 'Evaluators:'
    EVALUATOR_FIELDS = [:name, :arity, :transitivity, :role]
    EVALUATOR_FORMAT = '%-24s - %-15s - %-15s - %-20s'.freeze

    puts EVALUATOR_FORMAT % EVALUATOR_FIELDS
    Morpher::Evaluator::REGISTRY.each do |name, evaluator|
      presenter = Presenter::Evaluator.new(name, evaluator)
      puts EVALUATOR_FORMAT % EVALUATOR_FIELDS.map(&presenter.method(:public_send))
    end

    puts 'Preprocessors:'
    PREPROCESSOR_FORMAT = '%-20s - %-20s'
    PREPROCESSOR_FIELDS = [:name, :children_nodes]
    puts PREPROCESSOR_FORMAT % PREPROCESSOR_FIELDS
    Morpher::Compiler::Preprocessor::Emitter::REGISTRY.each do |name, emitter|
      presenter = Presenter::Preprocessor.new(name, emitter)
      puts PREPROCESSOR_FORMAT % PREPROCESSOR_FIELDS.map(&presenter.method(:public_send))
    end
  end
end