File: corpus

package info (click to toggle)
ruby-unparser 0.6.13-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 936 kB
  • sloc: ruby: 7,691; sh: 6; makefile: 4
file content (158 lines) | stat: -rwxr-xr-x 4,165 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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#!/usr/bin/env ruby
# frozen_string_literal: true

require 'mutant'
require 'optparse'
require 'unparser'

module Unparser
  module Corpus
    ROOT = Pathname.new(__dir__).parent
    TMP  = ROOT.join('tmp')

    class Project
      include Unparser::Anima.new(:name, :repo_uri, :repo_ref, :exclude)

      # Perform verification via unparser cli
      #
      # @return [Boolean]
      def verify
        checkout
        command = %W[unparser #{repo_path}]
        exclude.each do |name|
          command.push('--ignore', repo_path.join(name).to_s)
        end
        Kernel.system(*command)
      end

    private

      def checkout
        TMP.mkdir unless TMP.directory?

        if repo_path.exist?
          Dir.chdir(repo_path) do
            system(%w[git fetch])
            system(%w[git clean -f -d -x])
          end
        else
          system(%W[git clone #{repo_uri} #{repo_path}])
        end

        Dir.chdir(repo_path) do
          system(%W[git checkout #{repo_ref}])
          system(%w[git reset --hard])
          system(%w[git clean -f -d -x])
        end
      end

      def repo_path
        TMP.join(name)
      end

      def system(arguments)
        return if Kernel.system(*arguments)

        fail "System command #{arguments.inspect} failed!"
      end

      transform    = Mutant::Transform
      string       = transform::Primitive.new(primitive: String)
      string_array = transform::Array.new(transform: string)
      path         = ROOT.join('spec', 'integrations.yml')

      loader =
        transform::Named.new(
          name:      path.to_s,
          transform: transform::Sequence.new(
            steps: [
              transform::Exception.new(
                block:       :read.to_proc,
                error_class: SystemCallError
              ),
              transform::Exception.new(
                block:       YAML.method(:safe_load),
                error_class: YAML::SyntaxError
              ),
              transform::Array.new(
                transform: transform::Sequence.new(
                  steps: [
                    transform::Hash.new(
                      optional: [],
                      required: [
                        transform::Hash::Key.new(value: 'exclude',  transform: string_array),
                        transform::Hash::Key.new(value: 'name',     transform: string),
                        transform::Hash::Key.new(value: 'repo_ref', transform: string),
                        transform::Hash::Key.new(value: 'repo_uri', transform: string)
                      ]
                    ),
                    transform::Hash::Symbolize.new,
                    transform::Exception.new(
                      block:       Project.public_method(:new),
                      error_class: Unparser::Anima::Error
                    )
                  ]
                )
              )
            ]
          )
        )

      ALL = loader.call(path).lmap(&:compact_message).from_right
    end

    # Unparser corpus CLI implementation
    class CLI
      def self.run(*arguments)
        new(*arguments).exit_status
      end

      def initialize(arguments)
        @projects = []

        options = OptionParser.new do |builder|
          builder.on('--list', 'List registered projects') do
            Project::ALL.each do |project|
              puts(project.name)
            end

            Kernel.exit
          end
        end

        options.parse!(arguments).each do |name|
          @projects << project(name)
        end
      end

      def project(name)
        Project::ALL.find { |project| project.name.eql?(name) } || fail("Unregistered project: #{name}")
      end

      def effective_projects
        if @projects.empty?
          Project::ALL
        else
          @projects
        end
      end

      # Return exit status
      #
      # @return [Integer]
      #
      # @api private
      #
      def exit_status
        effective_projects.each do |project|
          project.verify || Kernel.exit(false)
        end

        Kernel.exit
      end

    end # CLI
  end # Corpus
end # Unparser

Unparser::Corpus::CLI.run(ARGV)