From 2906e03ff76d9db17653ff2243566ce5b50c7ec7 Mon Sep 17 00:00:00 2001
From: Philippe PITTOLI
Date: Fri, 27 Sep 2019 13:54:10 +0200
Subject: [PATCH] s/SpecFileParser/SpecParser/, non-catch'ed exceptions,
parsing data and files
---
debug.cr | 34 +++++++++-----
shard.yml | 4 +-
src/{specfileparser.cr => specparser.cr} | 56 +++++++++++++-----------
3 files changed, 56 insertions(+), 38 deletions(-)
rename src/{specfileparser.cr => specparser.cr} (91%)
diff --git a/debug.cr b/debug.cr
index 826c759..f950953 100644
--- a/debug.cr
+++ b/debug.cr
@@ -1,5 +1,5 @@
require "option_parser"
-require "./src/specfileparser"
+require "./src/specparser"
recipe_file_name = "some-non-existant-file"
@@ -18,39 +18,53 @@ end
options = Hash(String,String).new
options["someoptionexample"] = "option"
-specs = SpecFileParser.parse recipe_file_name, options
-pp! specs
-
+begin
+ specs = SpecParser.parse_file recipe_file_name, options
+ pp! specs
+rescue e
+ puts "(OK) #{e}"
+end
+data = "
+name: the-name
+version: the-version
+dirname: %{name}-%{version}
+"
+begin
+ specs = SpecParser.parse data, options
+ pp! specs
+rescue e
+ puts "(NOT OK) #{e}"
+end
# low level stuff
-sectioncontainer = SpecFileParser::Section.new "val"
+sectioncontainer = SpecParser::Section.new "val"
begin
puts sectioncontainer.as_s
- puts "(NOT OK) SpecFileParser::Section should not accept .as_s"
+ puts "(NOT OK) SpecParser::Section should not accept .as_s"
rescue e
puts "(OK) #{e}"
end
begin
pp! sectioncontainer.as_a_or_s
- puts "(NOT OK) SpecFileParser::Section should not accept .as_a_or_s"
+ puts "(NOT OK) SpecParser::Section should not accept .as_a_or_s"
rescue e
puts "(OK) #{e}"
end
-arraycontainer = SpecFileParser::ArrayContainer.new Array(String).new.push "value"
+arraycontainer = SpecParser::ArrayContainer.new Array(String).new.push "value"
begin
puts arraycontainer.as_s
- puts "(NOT OK) SpecFileParser::ArrayContainer should not accept .as_s"
+ puts "(NOT OK) SpecParser::ArrayContainer should not accept .as_s"
rescue e
puts "(OK) #{e}"
end
begin
pp! arraycontainer.as_a_or_s
- puts "(OK) SpecFileParser::ArrayContainer should accept .as_a_or_s"
+ puts "(OK) SpecParser::ArrayContainer should accept .as_a_or_s"
rescue e
puts "(NOT OK) #{e}"
end
diff --git a/shard.yml b/shard.yml
index adb3cc4..7af8979 100644
--- a/shard.yml
+++ b/shard.yml
@@ -1,5 +1,5 @@
-name: specfileparser
-version: 0.4.5
+name: specparser
+version: 0.5.0
authors:
- Philippe Pittoli
diff --git a/src/specfileparser.cr b/src/specparser.cr
similarity index 91%
rename from src/specfileparser.cr
rename to src/specparser.cr
index 6cbc979..cf4e073 100644
--- a/src/specfileparser.cr
+++ b/src/specparser.cr
@@ -1,5 +1,8 @@
-class SpecFileParser
+class SpecParser
+
+ class Exception < ::Exception
+ end
macro incompatible_methods(*names)
{% for name in names %}
@@ -40,7 +43,7 @@ class SpecFileParser
end
class LongStringContainer
- SpecFileParser.incompatible_methods as_s, as_a_or_s
+ SpecParser.incompatible_methods as_s, as_a_or_s
property value : String
def as_s_or_ls : String
@@ -52,7 +55,7 @@ class SpecFileParser
end
class ArrayContainer
- SpecFileParser.incompatible_methods as_s, as_s_or_ls
+ SpecParser.incompatible_methods as_s, as_s_or_ls
property value : Array(String)
def as_a_or_s : Array(String)
@@ -64,7 +67,7 @@ class SpecFileParser
end
class Section
- SpecFileParser.incompatible_methods as_s, as_a_or_s, as_s_or_ls
+ SpecParser.incompatible_methods as_s, as_a_or_s, as_s_or_ls
property name : String
property options : Array(String)
property content : Hash(String, StringContainer | ArrayContainer | LongStringContainer)
@@ -365,30 +368,31 @@ class SpecFileParser
end
- # The only function to use from outside.
+ #
+ # public functions
+ #
- def self.parse(file_name : String, options : Hash(String, String) | Nil = nil) : SpecFileParser | Nil
- begin
- content = File.read(file_name)
- content = content.rchop
+ def self.parse_file(file_name : String, options : Hash(String, String) | Nil = nil) : SpecParser
+ content = File.read(file_name)
+ content = content.rchop
- specs = SpecFileParser.new
- unless options.nil?
- options.each do |opt, val|
- specs.assignments[opt] = StringContainer.new val
- end
- end
-
- specs.parse_lines (content.split("\n"))
-
- specs.rewrite
-
- specs
- rescue e
- puts "Exception: #{e}"
-
- nil
- end
+ specs = parse content, options
end
+ def self.parse(data : String, options : Hash(String, String) | Nil = nil) : SpecParser
+ specs = SpecParser.new
+ unless options.nil?
+ options.each do |opt, val|
+ specs.assignments[opt] = StringContainer.new val
+ end
+ end
+
+ specs.parse_lines (data.split("\n"))
+
+ specs.rewrite
+
+ specs
+ rescue e
+ raise Exception.new "unexpected parser error: #{e}"
+ end
end