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