Class: Ibex::RakeTask
- Inherits:
-
Rake::TaskLib
- Object
- Rake::TaskLib
- Ibex::RakeTask
- 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
- #configured_action_source(target) ⇒ String?
- #configured_mode ⇒ Symbol
- #default_action_source_path(target) ⇒ String
- #define ⇒ void
- #grammar_prerequisites(source) ⇒ Array[String]
-
#initialize(name, &configuration) ⇒ RakeTask
constructor
A new instance of RakeTask.
- #reject_watch_option! ⇒ void
Constructor Details
#initialize(name, &configuration) ⇒ RakeTask
Returns a new instance of RakeTask.
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_source ⇒ String, ...
30 31 32 |
# File 'lib/ibex/rake_task.rb', line 30 def action_source @action_source end |
#grammar ⇒ String?
27 28 29 |
# File 'lib/ibex/rake_task.rb', line 27 def grammar @grammar end |
#options ⇒ Array[String]
29 30 31 |
# File 'lib/ibex/rake_task.rb', line 29 def @options end |
#output ⇒ String?
28 29 30 |
# File 'lib/ibex/rake_task.rb', line 28 def output @output end |
Instance Method Details
#configured_action_source(target) ⇒ String?
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.(path) == File.(target) raise ArgumentError, "action_source and output must be distinct" end path end |
#configured_mode ⇒ 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
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 |
#define ⇒ void
This method returns an undefined value.
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]
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.
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 |