From 8a8473e73ae839f6c220ea22419b4382e4e5d213 Mon Sep 17 00:00:00 2001 From: Ace Dimasuhid Date: Sun, 9 Jul 2017 23:55:43 +0800 Subject: [PATCH] Add Specs for Yaml files * Add spec/support folder * Add YamlSortChecker to check if yaml files are sorted * Add Diffy as a development dependency * Add spec file for all yaml config files for sorting --- colorls.gemspec | 1 + spec/support/yaml_sort_checker.rb | 53 +++++++++++++++++++++++++++++++ spec/yaml_spec.rb | 38 ++++++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 spec/support/yaml_sort_checker.rb create mode 100644 spec/yaml_spec.rb diff --git a/colorls.gemspec b/colorls.gemspec index d3f0462..6439eb5 100644 --- a/colorls.gemspec +++ b/colorls.gemspec @@ -29,4 +29,5 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'rake' spec.add_development_dependency 'rspec' spec.add_development_dependency 'rubocop' + spec.add_development_dependency 'diffy' end diff --git a/spec/support/yaml_sort_checker.rb b/spec/support/yaml_sort_checker.rb new file mode 100644 index 0000000..8eb5b67 --- /dev/null +++ b/spec/support/yaml_sort_checker.rb @@ -0,0 +1,53 @@ +require 'yaml' +require 'diffy' + +# Check Yaml if Alphabetically sorted +class YamlSortChecker + class NotSortedError < StandardError; end + + def initialize(filename) + @yaml = YAML.load_file(filename) + end + + def sorted?(type = :key) + case type.to_sym + when :key then key_sorted? + when :value then value_sorted? + end + + true + end + + private + + attr_reader :yaml + + def key_sorted? + sorted_yaml = yaml.to_a.sort_by { |content| content[0].downcase } + + different_from_yaml? sorted_yaml + end + + def value_sorted? + sorted_yaml = yaml.to_a.sort_by do |content| + [content[1].downcase, content[0].downcase] + end + + different_from_yaml? sorted_yaml + end + + def different_from_yaml?(sorted_yaml) + actual_str = enum_to_str(yaml) + expected_str = enum_to_str(sorted_yaml) + + difference = Diffy::Diff.new(actual_str, expected_str).to_s + + return if difference.empty? + + raise NotSortedError, "\n#{difference}" + end + + def enum_to_str(enum) + enum.to_a.map { |x| x.join(' ') }.join("\n") + end +end diff --git a/spec/yaml_spec.rb b/spec/yaml_spec.rb new file mode 100644 index 0000000..16cca2e --- /dev/null +++ b/spec/yaml_spec.rb @@ -0,0 +1,38 @@ +require 'spec_helper' +require 'support/yaml_sort_checker.rb' + +RSpec.describe 'Yaml files' do + let(:base_directory) { 'lib/yaml' } + + describe 'file_aliases.yaml' do + let(:checker) { YamlSortChecker.new("#{base_directory}/file_aliases.yaml") } + + it 'is sorted correctly' do + expect(checker.sorted?(:value)).to eq true + end + end + + describe 'folder_aliases.yaml' do + let(:checker) { YamlSortChecker.new("#{base_directory}/folder_aliases.yaml") } + + it 'is sorted correctly' do + expect(checker.sorted?(:value)).to eq true + end + end + + describe 'folders.yaml' do + let(:checker) { YamlSortChecker.new("#{base_directory}/folders.yaml") } + + it 'is sorted correctly' do + expect(checker.sorted?).to eq true + end + end + + describe 'files.yaml' do + let(:checker) { YamlSortChecker.new("#{base_directory}/files.yaml") } + + it 'is sorted correctly' do + expect(checker.sorted?).to eq true + end + end +end