diff --git a/lib/claws/workflow.rb b/lib/claws/workflow.rb index dba31d8..fec89c7 100644 --- a/lib/claws/workflow.rb +++ b/lib/claws/workflow.rb @@ -123,7 +123,7 @@ def normalize_permissions(input) # rubocop:disable Metrics/AbcSize, Metrics/Cycl def extract_normalized_on(workflow) if workflow["on"].is_a? String - line_number = workflow.keys.first { |k| k == "on" }.line + line_number = workflow.keys.find { |k| k == "on" }.line @on = workflow["on"] = [workflow["on"]] set_attr_line_number(:@on, line_number) else @@ -211,7 +211,7 @@ def set_attr_line_number(key, line) end def copy_key_with_line(blob, src, dst) - line = blob.keys.first { |k| k.to_sym == src.to_sym }.line + line = blob.keys.find { |k| k.to_sym == src.to_sym }.line new_key = String.new(dst).tap { |x| x.instance_eval { |_x| define_singleton_method(:line, -> { line }) } } # freezing it keeps ruby from making a copy w/o `line` diff --git a/spec/claws/workflow_spec.rb b/spec/claws/workflow_spec.rb index 3f79ea7..2d3081e 100644 --- a/spec/claws/workflow_spec.rb +++ b/spec/claws/workflow_spec.rb @@ -77,6 +77,30 @@ expect(BaseRule.parse_rule("$step.with.type_nil == nil").eval_with(values:)).to eq true expect(BaseRule.parse_rule("$step.with.type_float == 1.2").eval_with(values:)).to eq true end + + context "key normalization" do + it "preserves line numbers when normalizing hyphenated keys that are not the first key" do + workflow = described_class.load(<<~YAML) + name: test + + on: push + + jobs: + build: + defaults: + run: + working-directory: ./app + runs-on: ubuntu-latest + steps: + - run: echo hello + YAML + + job = workflow.jobs["build"] + runs_on_key = job.keys.find { |k| k == "runs_on" } + + expect(runs_on_key.line).to eq(10) + end + end end context "built in function - get_key" do