Commit 9029981

mo khan <mo@mokhan.ca>
2021-05-10 01:49:54
feat: ignore comments
1 parent 8318437
Changed files (3)
lib
spandx
terraform
spec
unit
terraform
lib/spandx/terraform/parsers/hcl.rb
@@ -12,12 +12,21 @@ module Spandx
         rule(:eol) { whitespace? >> crlf.repeat }
         rule(:hyphen) { str('-') }
         rule(:lcurly) { str('{') }
+        rule(:major) { number }
+        rule(:major_minor) { (number >> dot >> number) }
+        rule(:major_minor_patch) { number >> dot >> number >> dot >> number }
         rule(:number) { digit.repeat }
+        rule(:pre_release) { hyphen >> (alpha | digit).repeat }
+        rule(:pre_release?) { pre_release.maybe }
         rule(:quote) { str('"') }
         rule(:rcurly) { str('}') }
         rule(:space) { match('\s') }
-        rule(:whitespace) { space.repeat }
+        rule(:tilda_wacka) { str('~>') }
+        rule(:version) { number >> dot >> number >> dot >> number >> pre_release? }
+        rule(:line_comment) { str('#') >> ((str("\n") >> str("\r").maybe).absent? >> any).repeat >> eol }
+        rule(:whitespace) { (line_comment | space).repeat }
         rule(:whitespace?) { whitespace.maybe }
+        rule(:greater_than_or_equal_to) { str('>=') }
 
         rule :attribute_name do
           alpha.repeat
@@ -31,6 +40,34 @@ module Spandx
           match('[0-9A-Za-z.~> ]').repeat
         end
 
+        rule(:version_constraint) do
+          pessimistic_version_constraint | greater_than_or_equal_to_version
+        end
+
+        rule :version_assignment do
+          str('version') >> whitespace >> assign >> whitespace >> quote >> version.as(:version) >> quote
+        end
+
+        rule :constraint_assignment do
+          str('constraints') >> whitespace >> assign >> whitespace >> quote >> version_constraint.as(:constraints) >> quote
+        end
+
+        rule(:pessimistic_version_constraint) do
+          tilda_wacka >> whitespace >> (
+            major_minor_patch |
+            major_minor |
+            major
+          )
+        end
+
+        rule(:greater_than_or_equal_to_version) do
+          greater_than_or_equal_to >> whitespace >> (
+            major_minor_patch |
+            major_minor |
+            major
+          )
+        end
+
         rule :argument do
           alpha.repeat.as(:name) >> whitespace >> assign >> whitespace >> quote >> value.as(:value) >> quote
         end
@@ -39,23 +76,45 @@ module Spandx
           (argument >> eol).repeat
         end
 
+        rule :identifier do
+          whitespace >> quote >> ((alpha | match('[./]')).repeat).as(:name) >> quote >> whitespace
+        end
+
         rule :block_body do
           arguments.as(:arguments)
         end
 
         rule :block do
-          (alpha.repeat).as(:type) >> identifier >> whitespace >> lcurly >> eol >> block_body >> rcurly >> eol
-        end
-
-        rule :identifier do
-          whitespace >> quote >> ((alpha | match('[./]')).repeat).as(:name) >> quote >> whitespace
+          whitespace? >> (alpha.repeat).as(:type) >> identifier >> whitespace >> lcurly >> eol >> block_body >> rcurly >> eol
         end
 
         rule :blocks do
           block.repeat.as(:blocks)
         end
 
-        root(:blocks)
+        rule :comment do
+          str('#') >> match('.').repeat >> eol
+          line_comment
+        end
+
+        rule :comments do
+          comment.repeat
+        end
+
+        rule :blank_line do
+          eol
+        end
+
+        rule :blank_lines do
+          blank_line.repeat
+        end
+
+        rule :hcl do
+          # comments.maybe >> blank_lines.maybe >> blocks
+          blocks
+        end
+
+        root(:hcl)
       end
     end
   end
lib/spandx/terraform/parsers/lock_file.rb
@@ -6,7 +6,10 @@ module Spandx
       class LockFile
         def initialize; end
 
-        def parse(_path)
+        def parse(path)
+          parser = Spandx::Terraform::Parsers::Hcl.new
+          tree = parser.parse(IO.read(path))
+          puts tree.inspect
           []
         end
       end
spec/unit/terraform/parsers/hcl_spec.rb
@@ -9,6 +9,9 @@ RSpec.describe Spandx::Terraform::Parsers::Hcl do
     context 'when parsing an empty provider block' do
       let(:content) do
         <<~HCL
+          # This file is maintained automatically by "terraform init".
+          # Manual edits may be lost in future updates.
+
           provider "registry.terraform.io/hashicorp/aws" {
             version     = "3.39.0"
             constraints = "~> 3.27"
@@ -19,6 +22,7 @@ RSpec.describe Spandx::Terraform::Parsers::Hcl do
       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
         expect(subject[:blocks][0][:arguments]).to match_array([
           { name: 'version', value: '3.39.0' },
@@ -104,4 +108,6 @@ RSpec.describe Spandx::Terraform::Parsers::Hcl do
   specify { expect(parser.rcurly).to parse('}') }
   specify { expect(parser.quote).to parse('"') }
   specify { expect(parser.space).to parse(' ') }
+  specify { expect(parser.comment).to parse('# This file is maintained automatically by "terraform init".') }
+  specify { expect(parser.comment).to parse('# Manual edits may be lost in future updates.') }
 end