Commit d15aad9

mo khan <mo@mokhan.ca>
2021-05-09 17:35:57
feat: parse provider name from provider block
1 parent 9ced66a
Changed files (3)
lib
spandx
terraform
spec
unit
lib/spandx/terraform/parsers/parse_tree.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+module Spandx
+  module Terraform
+    module Parsers
+      class ParseTree < Parslet::Parser
+        rule :crlf do
+          match('[\r\n]')
+        end
+
+        rule :eol do
+          whitespace? >> crlf.repeat(1)
+        end
+
+        rule :whitespace? do
+          whitespace.maybe
+        end
+
+        rule :whitespace do
+          match('[ ]').repeat
+        end
+
+        rule :anything do
+          match('.').repeat
+        end
+
+        rule :attribute_name do
+          match('[a-z]').repeat
+        end
+
+        rule :assignment do
+          whitespace? >> attribute_name >> whitespace >> str('=') >> whitespace >> str("=") >> whitespace >> match('[0-9A-Za-z.~> ]') >> str('"') >> eol
+        end
+
+        rule :assignments do
+          assignment.repeat
+        end
+
+        rule :block do
+          whitespace >> str("{") >> eol >> assignments >> str("}") >> eol
+        end
+
+        rule :identifier do
+          whitespace >> str('"') >> match('[a-zA-Z./]').repeat.as(:name) >> str('"') >> whitespace
+        end
+
+        rule :provider do
+          (str("provider") >> identifier >> block).as(:provider)
+        end
+
+        rule :providers do
+          provider.repeat
+        end
+
+        root(:providers)
+      end
+    end
+  end
+end
spec/unit/spdx/expression_spec.rb
@@ -1,10 +1,10 @@
 # frozen_string_literal: true
 
 RSpec.describe Spandx::Spdx::Expression do
-  subject { described_class.new }
+  subject(:parser) { described_class.new }
 
   describe '#parse' do
-    subject { described_class.new.parse_with_debug(expression) }
+    subject { parser.parse_with_debug(expression) }
 
     context 'when parsing `MIT`' do
       let(:expression) { 'MIT' }
spec/unit/terraform/parsers/parse_tree_spec.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+RSpec.describe Spandx::Terraform::Parsers::ParseTree do
+  subject(:parser) { described_class.new }
+
+  describe '#parse' do
+    subject { parser.parse_with_debug(content) }
+
+    context "when parsing an empty provider block" do
+      let(:content) do
+        <<~HCL
+        provider "registry.terraform.io/hashicorp/aws" {
+
+        }
+        HCL
+      end
+
+      specify { expect(subject[0].dig(:provider, :name).to_s).to eql('registry.terraform.io/hashicorp/aws') }
+      specify { expect(subject).to be_truthy }
+    end
+  end
+end