Commit d15aad9
Changed files (3)
lib
spandx
terraform
parsers
spec
unit
spdx
terraform
parsers
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