From 6d36d007ad67af4016656174ae0a86ad7e876999 Mon Sep 17 00:00:00 2001 From: Olle Jonsson Date: Tue, 22 Sep 2015 21:45:16 +0200 Subject: [PATCH] ParserFile: support values with equals signs --- lib/github_changelog_generator/parser_file.rb | 53 ++++++++++--------- spec/files/github_changelog_params_override | 1 + spec/unit/parse_file_spec.rb | 25 ++++++--- 3 files changed, 45 insertions(+), 34 deletions(-) diff --git a/lib/github_changelog_generator/parser_file.rb b/lib/github_changelog_generator/parser_file.rb index 74f3cd3..b8a77e2 100644 --- a/lib/github_changelog_generator/parser_file.rb +++ b/lib/github_changelog_generator/parser_file.rb @@ -4,33 +4,34 @@ module GitHubChangelogGenerator @options = options end - def file - File.expand_path(@options[:params_file] || ".github_changelog_generator") - end - - def file? - File.exist?(file) - end - - def file_open - File.open(file) - end - def parse! - return unless file? - file_open.each do |line| - begin - key, value = line.split("=") - key_sym = key.sub("-", "_").to_sym - value = value.gsub(/[\n\r]+/, "") - value = true if value =~ (/^(true|t|yes|y|1)$/i) - value = false if value =~ (/^(false|f|no|n|0)$/i) - @options[key_sym] = value - rescue - raise "File #{file} is incorrect in line \"#{line.gsub(/[\n\r]+/, '')}\"" - end - end - @options + return unless File.exist?(file) + + File.readlines(file).each { |line| parse_line!(line) } + end + + private + + def file + @file ||= File.expand_path(@options[:params_file] || ".github_changelog_generator") + end + + def parse_line!(line) + key_sym, value = extract_pair(line) + value = true if value =~ (/^(true|t|yes|y|1)$/i) + value = false if value =~ (/^(false|f|no|n|0)$/i) + @options[key_sym] = value + rescue + raise "Config file #{file} is incorrect in line \"#{line.gsub(/[\n\r]+/, '')}\"" + end + + # Returns a the setting as a symbol and its string value sans newlines. + # + # @param line [String] unparsed line from config file + # @return [Array] + def extract_pair(line) + key, value = line.split("=", 2) + [key.sub("-", "_").to_sym, value.gsub(/[\n\r]+/, "")] end end end diff --git a/spec/files/github_changelog_params_override b/spec/files/github_changelog_params_override index ff0a972..c31e411 100644 --- a/spec/files/github_changelog_params_override +++ b/spec/files/github_changelog_params_override @@ -1,2 +1,3 @@ unreleased_label=staging unreleased=false +header==== Changelog === diff --git a/spec/unit/parse_file_spec.rb b/spec/unit/parse_file_spec.rb index 55c743d..eb8af0c 100644 --- a/spec/unit/parse_file_spec.rb +++ b/spec/unit/parse_file_spec.rb @@ -10,23 +10,32 @@ describe GitHubChangelogGenerator::ParserFile do context "when file is empty" do let(:options) { { params_file: "spec/files/github_changelog_params_empty" } } let(:parse) { GitHubChangelogGenerator::ParserFile.new(options) } - subject { parse.parse! } - it { is_expected.to be_a(Hash) } - it { is_expected.to eq(options) } + + it "does not change the options" do + expect { parse.parse! }.to_not change { options } + end end context "when file is incorrect" do let(:options) { { params_file: "spec/files/github_changelog_params_incorrect" } } + let(:options_before_change) { options.dup } let(:parse) { GitHubChangelogGenerator::ParserFile.new(options) } - it { expect { fail.raise! }.to raise_error RuntimeError } + it { expect { parse.parse! }.to raise_error } end context "when override default values" do - let(:options) { { params_file: "spec/files/github_changelog_params_override" }.merge(GitHubChangelogGenerator::Parser.get_default_options) } + let(:default_options) { GitHubChangelogGenerator::Parser.get_default_options } + let(:options) { { params_file: "spec/files/github_changelog_params_override" }.merge(default_options) } + let(:options_before_change) { options.dup } let(:parse) { GitHubChangelogGenerator::ParserFile.new(options) } - subject { parse.parse! } - it { is_expected.to be_a(Hash) } - it { is_expected.to eq(options.merge(unreleased_label: "staging", unreleased: false)) } + + it "changes the options" do + expect { parse.parse! }.to change { options } + .from(options_before_change) + .to(options_before_change.merge(unreleased_label: "staging", + unreleased: false, + header: "=== Changelog ===")) + end end end end