Commit 149b738

mo khan <mo@mokhan.ca>
2021-05-10 00:57:45
refactor: use generic name/types for blocks
1 parent 1858fd1
Changed files (2)
lib
spandx
terraform
parsers
spec
unit
terraform
lib/spandx/terraform/parsers/hcl.rb
@@ -36,7 +36,7 @@ module Spandx
         end
 
         rule :value do
-          match('[0-9A-Za-z.~> ]')
+          match('[0-9A-Za-z.~> ]').repeat
         end
 
         rule(:version_constraint) do
@@ -68,37 +68,26 @@ module Spandx
         end
 
         rule :argument do
-          (
-            str('version') |
-            str('constraints')
-          ).as(:argument) >> whitespace >> assign >> whitespace >> quote >> (
-            version |
-            version_constraint
-          ).as(:value) >> quote
+          alpha.repeat.as(:name) >> whitespace >> assign >> whitespace >> quote >> value.as(:value) >> quote
         end
 
         rule :arguments do
-          #((version_assignment | constraint_assignment) >> eol).repeat
           (argument >> eol).repeat
         end
 
         rule :block do
-          whitespace >> lcurly >> eol >> arguments >> rcurly >> eol
+          (alpha.repeat).as(:type) >> identifier >> whitespace >> lcurly >> eol >> arguments.as(:arguments) >> rcurly >> eol
         end
 
         rule :identifier do
           whitespace >> quote >> ((alpha | match('[./]')).repeat).as(:name) >> quote >> whitespace
         end
 
-        rule :provider do
-          (str('provider') >> identifier >> block).as(:provider)
+        rule :blocks do
+          block.repeat.as(:blocks)
         end
 
-        rule :providers do
-          provider.repeat
-        end
-
-        root(:providers)
+        root(:blocks)
       end
     end
   end
spec/unit/terraform/parsers/hcl_spec.rb
@@ -16,12 +16,14 @@ RSpec.describe Spandx::Terraform::Parsers::Hcl do
         HCL
       end
 
-      specify { expect(subject[0].dig(:provider, :name).to_s).to eql('registry.terraform.io/hashicorp/aws') }
-      specify { expect(subject[1].dig(:provider, :version).to_s).to eql('3.39.0') }
-      specify { expect(subject[2].dig(:provider, :constraints).to_s).to eql('~> 3.27') }
       specify { expect(subject).to be_truthy }
+      specify { expect(subject[:blocks][0][:name].to_s).to eql('registry.terraform.io/hashicorp/aws') }
+      specify { expect(subject[:blocks][0][:type].to_s).to eql('provider') }
       specify do
-        puts subject
+        expect(subject[:blocks][0][:arguments]).to match_array([
+          { name: 'version', value: '3.39.0' },
+          { name: 'constraints', value: '~> 3.27' },
+        ])
       end
     end
   end