Class: Ibex::RakeTask

Inherits:
Rake::TaskLib show all
Defined in:
lib/ibex/rake_task.rb,
sig/ibex/rake_task.rbs

Overview

Declares grammar-to-parser generation in a Rakefile.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, &configuration) ⇒ RakeTask

Returns a new instance of RakeTask.

RBS:

  • (String | Symbol name) ?{ (RakeTask) -> void } -> void

Parameters:

  • name (String, Symbol)


33
34
35
36
37
38
39
40
41
42
# File 'lib/ibex/rake_task.rb', line 33

def initialize(name, &configuration)
  super()
  @name = name
  @grammar = nil
  @output = name.to_s.end_with?(".rb") ? name.to_s : nil
  @options = []
  @action_source = nil
  configuration&.call(self)
  define
end

Instance Attribute Details

#action_sourceString, ...

Signature:

  • String | true | nil

Returns:

  • (String, true, nil)


30
31
32
# File 'lib/ibex/rake_task.rb', line 30

def action_source
  @action_source
end

#grammarString?

Signature:

  • String?

Returns:

  • (String, nil)


27
28
29
# File 'lib/ibex/rake_task.rb', line 27

def grammar
  @grammar
end

#optionsArray[String]

Signature:

  • Array[String]

Returns:

  • (Array[String])


29
30
31
# File 'lib/ibex/rake_task.rb', line 29

def options
  @options
end

#outputString?

Signature:

  • String?

Returns:

  • (String, nil)


28
29
30
# File 'lib/ibex/rake_task.rb', line 28

def output
  @output
end

Instance Method Details

#configured_action_source(target) ⇒ String?

RBS:

  • (String target) -> String?

Parameters:

  • target (String)

Returns:

  • (String, nil)


79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/ibex/rake_task.rb', line 79

def configured_action_source(target)
  return nil unless @action_source

  path = @action_source == true ? default_action_source_path(target) : @action_source
  raise ArgumentError, "action_source must be true or a non-empty String" unless
    path.is_a?(String) && !path.empty?
  if File.expand_path(path) == File.expand_path(target)
    raise ArgumentError, "action_source and output must be distinct"
  end

  path
end

#configured_modeSymbol

RBS:

  • () -> Symbol

Returns:

  • (Symbol)


108
109
110
111
112
113
114
# File 'lib/ibex/rake_task.rb', line 108

def configured_mode
  explicit = @options.find { |option| option.start_with?("--mode=") }
  return explicit.delete_prefix("--mode=").to_sym if explicit

  index = @options.index("--mode")
  index ? @options.fetch(index + 1, "default").to_sym : :default
end

#default_action_source_path(target) ⇒ String

RBS:

  • (String target) -> String

Parameters:

  • target (String)

Returns:

  • (String)


93
94
95
96
97
98
99
# File 'lib/ibex/rake_task.rb', line 93

def default_action_source_path(target)
  directory = File.dirname(target)
  basename = File.basename(target)
  replaced = basename.sub(/\.[^.]+\z/, ".actions.rb")
  replaced = "#{basename}.actions.rb" if replaced == basename
  directory == "." ? replaced : File.join(directory, replaced)
end

#definevoid

This method returns an undefined value.

RBS:

  • () -> void



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/ibex/rake_task.rb', line 47

def define
  source = @grammar || raise(ArgumentError, "grammar is required")
  reject_watch_option!
  target = @output || source.sub(/\.[^.]+\z/, ".rb")
  target = "#{source}.rb" if target == source
  prerequisites = grammar_prerequisites(source)
  action_target = configured_action_source(target)
  arguments = [*@options]
  arguments << (@action_source == true ? "--action-source" : "--action-source=#{action_target}") if action_target
  generate = lambda do |_task, _task_arguments|
    status = CLI.start([*arguments, "--output-file=#{target}", source])
    raise "parser generation failed for #{source}" unless status.zero?
  end

  if action_target
    Rake::FileTask.define_task(action_target => prerequisites, &generate)
    Rake::FileTask.define_task(target => [*prerequisites, action_target], &generate)
  else
    Rake::FileTask.define_task(target => prerequisites, &generate)
  end

  Rake::Task.define_task(@name => target) unless @name.to_s == target
end

#grammar_prerequisites(source) ⇒ Array[String]

RBS:

  • (String source) -> Array[String]

Parameters:

  • source (String)

Returns:

  • (Array[String])


102
103
104
105
# File 'lib/ibex/rake_task.rb', line 102

def grammar_prerequisites(source)
  dependencies = Frontend::Resolver.new(source, mode: configured_mode).dependencies
  [source, *dependencies.drop(1)]
end

#reject_watch_option!void

This method returns an undefined value.

RBS:

  • () -> void



72
73
74
75
76
# File 'lib/ibex/rake_task.rb', line 72

def reject_watch_option!
  return unless @options.any? { |option| option == "--watch" || option.start_with?("--watch=") }

  raise ArgumentError, "RakeTask options must not include --watch"
end