diff --git a/.editorconfig b/.editorconfig index 0da8f80..f8ae8b4 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,3 +1,5 @@ [*] indent_size = 2 indent_style = space +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..dc15109 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,31 @@ +name: test + +on: + workflow_dispatch: + schedule: + - cron: '3 0 2 * *' + push: + +jobs: + test: + runs-on: ubuntu-latest + name: Ruby ${{ matrix.ruby }} + strategy: + matrix: + ruby: + - '2.7' + - '3.0' + - '3.1' + - '3.2' + - '3.3' + steps: + - uses: actions/checkout@v4 + - name: Set up RUby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ matrix.ruby }} + bundler-cache: true + - name: lint + run: bundle exec rake standard + - name: test + run: bundle exec rake spec diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 0000000..1ea9b91 --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1,5 @@ +require: + - standard + +inherit_gem: + standard: config/base.yml diff --git a/.standard.yml b/.standard.yml new file mode 100644 index 0000000..3741b18 --- /dev/null +++ b/.standard.yml @@ -0,0 +1,3 @@ +# For available configuration options, see: +# https://github.com/testdouble/standard +ruby_version: 2.7 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index b1aa6b8..0000000 --- a/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -sudo: false -language: ruby -cache: bundler -rvm: - - 2.6.5 -before_install: gem install bundler -v 2.0.2 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..49515ed --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,7 @@ +## [0.3.5] 2024-08-16 + +- standardrb compliant + +## [0.1.0] 2021-04-16 + +- initial release diff --git a/Gemfile b/Gemfile index 336cd1e..b05d6f2 100644 --- a/Gemfile +++ b/Gemfile @@ -2,3 +2,16 @@ source "https://rubygems.org" # Specify your gem's dependencies in graph.gemspec gemspec + +gem "bundler", "~> 2.0" +gem "rake", "~> 13.0" + +gem "standard", "~> 1.37" +gem "rubocop", "~> 1.62" +gem "yard" + +group :test do + gem "minitest", "~> 5.0" + gem "minitest-reporters", "~> 1" + gem "minitest-power_assert" +end diff --git a/Rakefile b/Rakefile index f7ff562..4f377b3 100644 --- a/Rakefile +++ b/Rakefile @@ -8,9 +8,11 @@ Rake::TestTask.new(:spec) do |t| t.test_files = FileList["spec/**/*_spec.rb"] end +require "standard/rake" + YARD::Rake::YardocTask.new do |t| t.files = ["lib/**/*.rb"] t.options = ["--any", "--extra", "--opts"] end -task :default => :spec +task default: :spec diff --git a/exe/simple-hd-graph b/exe/simple-hd-graph index 6e98ee2..4fd01ec 100755 --- a/exe/simple-hd-graph +++ b/exe/simple-hd-graph @@ -1,8 +1,8 @@ #! /usr/bin/env ruby -$LOAD_PATH.unshift File.absolute_path(File.join(__dir__, '../lib')) +$LOAD_PATH.unshift File.absolute_path(File.join(__dir__, "../lib")) -require 'simple-hd-graph' +require "simple-hd-graph" Version = SimpleHdGraph::VERSION cmd = SimpleHdGraph::Command.new diff --git a/lib/simple-hd-graph.rb b/lib/simple-hd-graph.rb index 462df02..58f1506 100644 --- a/lib/simple-hd-graph.rb +++ b/lib/simple-hd-graph.rb @@ -3,6 +3,6 @@ class Error < StandardError; end # Your code goes here... end -Dir.glob(__dir__ + '/simple-hd-graph/**/*.rb').each { |f| - require f.sub(/\.rb\z/, '') +Dir.glob(__dir__ + "/simple-hd-graph/**/*.rb").each { |f| + require f.sub(/\.rb\z/, "") } diff --git a/lib/simple-hd-graph/command.rb b/lib/simple-hd-graph/command.rb index a2912e0..59f3c3b 100644 --- a/lib/simple-hd-graph/command.rb +++ b/lib/simple-hd-graph/command.rb @@ -1,9 +1,8 @@ -require 'optparse' +require "optparse" module SimpleHdGraph - class Error < StandardError; end class FileNotExist < Error; end - class DirectoryNotExist < Error; end + class DirectoryNotExist < Error; end # rubocop:disable Layout/EmptyLineBetweenDefs class Command # @@ -39,7 +38,7 @@ def parse(argv) # @return [String] # def stream - if (@dir) + if @dir reader.read_dir(@dir) else reader.read_file(@file) @@ -58,25 +57,25 @@ def start # :reek:NestedIterators, :reek:DuplicateMethodCall def opts OptionParser.new do |opt| - opt.on('-d DIR', '--dir', 'dirname') { |value| + opt.on("-d DIR", "--dir", "dirname") { |value| if File.exist?(value) && File.directory?(value) @dir = value else raise DirectoryNotExist, value end } - opt.on('-f FILE', '--file', 'filename') { |value| + opt.on("-f FILE", "--file", "filename") { |value| if File.exist?(value) && File.file?(value) @file = value else raise FileNotExist, value end } - opt.on('-r RENDERER', '--renderer', 'renderer') { |value| + opt.on("-r RENDERER", "--renderer", "renderer") { |value| begin @renderer = SimpleHdGraph::Renderer.method(value) rescue NameError - STDERR.puts "[Warining] renderer `#{value}` not found. falling back to :plantuml" + warn "[Warining] renderer `#{value}` not found. falling back to :plantuml" end } end diff --git a/lib/simple-hd-graph/context.rb b/lib/simple-hd-graph/context.rb index 8b24082..2f0b9ce 100644 --- a/lib/simple-hd-graph/context.rb +++ b/lib/simple-hd-graph/context.rb @@ -1,4 +1,4 @@ -require 'simple-hd-graph/node' +require "simple-hd-graph/node" module SimpleHdGraph class ContextNode < Node @@ -39,15 +39,14 @@ def set_depends(depends) @depends = depends end - # :reek:NestedIterators, :reek:TooManyStatements def refill_relation - @resource ||= [] + @resource ||= [] @relations ||= [] @resources.each { |resource| dependencies = resource.has - if dependencies + if dependencies.respond_to? :each dependencies.each { |dependency| - @relations << { resource.id => @resource_dict[dependency] } + @relations << {resource.id => @resource_dict[dependency]} } end } diff --git a/lib/simple-hd-graph/node.rb b/lib/simple-hd-graph/node.rb index 603eed8..9846d05 100644 --- a/lib/simple-hd-graph/node.rb +++ b/lib/simple-hd-graph/node.rb @@ -1,8 +1,8 @@ -require 'dry/inflector' +require "dry/inflector" module SimpleHdGraph class Node - class RequiredFieldNotFilled < StandardError; end + class RequiredFieldNotFilled < Error; end class << self # @@ -13,7 +13,7 @@ def required(*names) end end - CAMELIZE_SEPARATOR = ' ,.、。' + CAMELIZE_SEPARATOR = /[ ,.、。]/ def initialize @inflector = Dry::Inflector.new @@ -22,27 +22,26 @@ def initialize # # @param struct [Hash] # - # :reek:TooManyStatements def load(struct) klass = self.class - required_fields = if klass.instance_variables.grep(/@required_fields/).size > 0 - klass.instance_variable_get('@required_fields') - else - nil - end - - if required_fields.is_a? Array - filled = required_fields.all? {|field| - if struct.has_key? field - true - else - raise RequiredFieldNotFilled, field - end - } - else - filled = true - end + required_fields = + if klass.instance_variables.grep(/@required_fields/).size > 0 + klass.instance_variable_get(:@required_fields) + end + + filled = + if required_fields.is_a? Array + required_fields.all? { |field| + if struct.has_key? field + true + else + raise RequiredFieldNotFilled, field + end + } + else + true + end @content = struct if filled end @@ -52,7 +51,7 @@ def load(struct) # @return [String] # def camelize(str) - @inflector.camelize(@inflector.underscore(str.gsub(/[#{CAMELIZE_SEPARATOR}]/, '_'))) + @inflector.camelize(@inflector.underscore(str.gsub(CAMELIZE_SEPARATOR, "_"))) end end end diff --git a/lib/simple-hd-graph/parser.rb b/lib/simple-hd-graph/parser.rb index f231272..5c37161 100644 --- a/lib/simple-hd-graph/parser.rb +++ b/lib/simple-hd-graph/parser.rb @@ -1,34 +1,32 @@ -require 'yaml' +require "yaml" module SimpleHdGraph # # parse for YAML string # - # :reek:InstanceVaariableAssumption class Parser - KEYWORD_ID ||= 'id'.freeze - KEYWORD_RESOURCES ||= 'resources'.freeze - KEYWORD_DEPENDS ||= 'depends'.freeze + KEYWORD_ID = "id".freeze + KEYWORD_RESOURCES = "resources".freeze + KEYWORD_DEPENDS = "depends".freeze # # @param document [String] # - # :reek:TooManyStatements def parse(document) contexts = [] YAML.load_stream(document) do |node| next unless node - context = nil + context = nil resources = nil - depends = nil + depends = nil node.each_pair { |key, value| case key when KEYWORD_ID context = ContextNode.new - context.load({ id: value }) + context.load({id: value}) when KEYWORD_DEPENDS depends = value when KEYWORD_RESOURCES @@ -62,7 +60,7 @@ def pack_depends_into_context(depends, context) def pack_resources_into_context(resources, context) resources.each { |key, resource| rn = ResourceNode.new - rn.load_with_context({ id: context.id }, { key => resource }) + rn.load_with_context({id: context.id}, {key => resource}) context << rn } end @@ -71,7 +69,7 @@ def pack_resources_into_context(resources, context) # @param contexts [Array] # def refill_relation(contexts) - contexts.each {|context| + contexts.each { |context| context.refill_relation } end @@ -83,9 +81,9 @@ def refill_depends(contexts) contexts.map { |context| if context.depends regularized = context.depends.map { |dependee| - d = contexts.select { |c| + d = contexts.find { |c| c.alias == dependee - }.first + } { context.id => d ? d.id : dependee diff --git a/lib/simple-hd-graph/reader.rb b/lib/simple-hd-graph/reader.rb index 543feda..8ba6482 100644 --- a/lib/simple-hd-graph/reader.rb +++ b/lib/simple-hd-graph/reader.rb @@ -4,7 +4,6 @@ class Reader # @param file [String] # @return [String] # - # :reek:UtilityFunction def read_file(file) File.read(file) end @@ -14,7 +13,7 @@ def read_file(file) # @return [String] # def read_dir(dir) - Dir.glob("#{dir}/**/*.{yml,yaml}").map {|file| + Dir.glob("#{dir}/**/*.{yml,yaml}").map { |file| read_file(file) }.join("---\n") end diff --git a/lib/simple-hd-graph/renderer/plantuml.rb b/lib/simple-hd-graph/renderer/plantuml.rb index 4c96bcb..1725bed 100644 --- a/lib/simple-hd-graph/renderer/plantuml.rb +++ b/lib/simple-hd-graph/renderer/plantuml.rb @@ -1,4 +1,4 @@ -Dir.glob(File.join(__dir__, '**/*.rb')).each { |f| require f } +Dir.glob(File.join(__dir__, "plantuml/*.rb")).sort.each { |f| require f } module SimpleHdGraph module Renderer diff --git a/lib/simple-hd-graph/renderer/plantuml/context.rb b/lib/simple-hd-graph/renderer/plantuml/context.rb index 665ae0d..40441eb 100644 --- a/lib/simple-hd-graph/renderer/plantuml/context.rb +++ b/lib/simple-hd-graph/renderer/plantuml/context.rb @@ -9,24 +9,33 @@ def initialize # # @param node [ContextNode] # - # :reek:FeatureEnvy, :reek:DuplicateMethodCall def render(node) - resources = node.resources.map { |resource| - indent_resource(resource) - }.join if node.resources.size > 0 - relations = node.relations.map { |relation| - render_relation(relation) - }.join("\n") if node.relations.size > 0 - depends = node.depends.map { |depending| - render_depends(depending) - }.join("\n") if node.depends.size > 0 - (<<-EOD).gsub(/^$\n/, '') -rectangle \"#{node.alias}\" as #{node.id} { -#{resources} -#{relations} -} -#{depends} -EOD + resources = + if node.resources.size > 0 + node.resources.map { |resource| + indent_resource(resource) + }.join + end + relations = + if node.relations.size > 0 + node.relations.map { |relation| + render_relation(relation) + }.join("\n") + end + depends = + if node.depends.size > 0 + node.depends.map { |depending| + render_depends(depending) + }.join("\n") + end + + <<~EOD.gsub(/^$\n/, "") + rectangle "#{node.alias}" as #{node.id} { + #{resources} + #{relations} + } + #{depends} + EOD end # diff --git a/lib/simple-hd-graph/renderer/plantuml/resource.rb b/lib/simple-hd-graph/renderer/plantuml/resource.rb index 5b9703c..5e22717 100644 --- a/lib/simple-hd-graph/renderer/plantuml/resource.rb +++ b/lib/simple-hd-graph/renderer/plantuml/resource.rb @@ -10,11 +10,11 @@ def render(node) content = node.content.map { |key, value| " #{key}: #{value}" }.join("\n") - < 0" - - spec.add_development_dependency "bundler", "~> 2.0" - spec.add_development_dependency "rake", "~> 13.0" - spec.add_development_dependency "minitest", "~> 5.0" - spec.add_development_dependency "minitest-reporters", "~> 1" - spec.add_development_dependency "minitest-power_assert" - spec.add_development_dependency "yard" end diff --git a/spec/command_spec.rb b/spec/command_spec.rb index 4559fd2..b0e0a64 100644 --- a/spec/command_spec.rb +++ b/spec/command_spec.rb @@ -1,42 +1,42 @@ -require 'spec_helper' +require "spec_helper" describe SimpleHdGraph::Command do def command @command ||= SimpleHdGraph::Command.new end - describe '#parse' do - describe 'file' do - describe 'exists' do + describe "#parse" do + describe "file" do + describe "exists" do it { assert { - command.parse(['-f', File.join(__dir__, 'support/example_simple.yaml')]) + command.parse(["-f", File.join(__dir__, "support/example_simple.yaml")]) } } end - describe 'not exist' do + describe "not exist" do it { assert_raises SimpleHdGraph::FileNotExist do - command.parse(['-f', 'notexist']) + command.parse(["-f", "notexist"]) end } end end - describe 'dir' do - describe 'exists' do + describe "dir" do + describe "exists" do it { assert { - command.parse(['-d', File.join(__dir__, 'support')]) + command.parse(["-d", File.join(__dir__, "support")]) } } end - describe 'not exist' do + describe "not exist" do it { assert_raises SimpleHdGraph::DirectoryNotExist do - command.parse(['-d', 'notexist']) + command.parse(["-d", "notexist"]) end } end diff --git a/spec/context_spec.rb b/spec/context_spec.rb index 40be13a..f3073a8 100644 --- a/spec/context_spec.rb +++ b/spec/context_spec.rb @@ -1,25 +1,25 @@ -require 'spec_helper' +require "spec_helper" describe SimpleHdGraph::ContextNode do before { @node = SimpleHdGraph::ContextNode.new } - describe '#alias' do - describe 'small letter only' do + describe "#alias" do + describe "small letter only" do it { - @node.load({ id: 'foo' }) + @node.load({id: "foo"}) assert { - @node.id == 'foo' + @node.id == "foo" } } end - describe 'has white space' do + describe "has white space" do it { - @node.load({ id: 'foo bar' }) + @node.load({id: "foo bar"}) assert { - @node.id == 'fooBar' + @node.id == "fooBar" } } end diff --git a/spec/node_spec.rb b/spec/node_spec.rb index 40a2fee..6440d94 100644 --- a/spec/node_spec.rb +++ b/spec/node_spec.rb @@ -1,6 +1,6 @@ -require 'spec_helper' +require "spec_helper" -require 'yaml' +require "yaml" class TestingSingleRequiredFieldNode < SimpleHdGraph::Node required :name @@ -11,21 +11,21 @@ class TestingMultipleRequiredFieldsNode < SimpleHdGraph::Node end def testing_single_required_valid_structure - YAML.load(< e - e.message == 'id' + e.message == "id" end } end diff --git a/spec/parser_spec.rb b/spec/parser_spec.rb index 20590f5..c7ef5c6 100644 --- a/spec/parser_spec.rb +++ b/spec/parser_spec.rb @@ -1,57 +1,57 @@ -require 'spec_helper' +require "spec_helper" describe SimpleHdGraph::Parser do include ExampleLoader let(:parser) { SimpleHdGraph::Parser.new } - describe '#parse' do - describe 'simple' do + describe "#parse" do + describe "simple" do before { @nodes = parser.parse(read_example(:simple)) } - it 'context' do + it "context" do assert { @nodes.all? { |context| - context.class == SimpleHdGraph::ContextNode + context.is_a?(SimpleHdGraph::ContextNode) } } end - it 'context id' do + it "context id" do assert { - @nodes.first.id == 'simple' + @nodes.first.id == "simple" } end - it 'resource' do + it "resource" do assert { @nodes.all? { |context| context.resources.all? { |resource| - resource.class == SimpleHdGraph::ResourceNode + resource.is_a?(SimpleHdGraph::ResourceNode) } } } end end - describe 'complex' do + describe "complex" do before { @nodes = parser.parse(read_example(:complex)) } - it 'relations' do + it "relations" do assert { @nodes.first.relations == [ - { 'example1Web' => 'example1Admin' }, - { 'example1Web' => 'example1Storage' } + {"example1Web" => "example1Admin"}, + {"example1Web" => "example1Storage"} ] } end end - describe 'depends' do + describe "depends" do before { @nodes = parser.parse( [ @@ -63,7 +63,7 @@ it { assert { - @nodes.map { |node| node.depends } == [[], [{'example2' => 'example1'}]] + @nodes.map { |node| node.depends } == [[], [{"example2" => "example1"}]] } } end diff --git a/spec/reader_spec.rb b/spec/reader_spec.rb index fabee6b..75249fe 100644 --- a/spec/reader_spec.rb +++ b/spec/reader_spec.rb @@ -1,11 +1,11 @@ -require 'spec_helper' +require "spec_helper" describe SimpleHdGraph::Reader do - describe '#read_dir' do + describe "#read_dir" do it { reader = SimpleHdGraph::Reader.new assert { - reader.read_dir(File.join(__dir__, 'support')) + reader.read_dir(File.join(__dir__, "support")) } } end diff --git a/spec/renderer/plantuml/context_spec.rb b/spec/renderer/plantuml/context_spec.rb index 7bf1688..f0d800d 100644 --- a/spec/renderer/plantuml/context_spec.rb +++ b/spec/renderer/plantuml/context_spec.rb @@ -1,4 +1,4 @@ -require 'spec_helper' +require "spec_helper" describe SimpleHdGraph::Renderer::PlantUML::Context do include ExampleLoader @@ -6,8 +6,8 @@ let(:parser) { SimpleHdGraph::Parser.new } let(:renderer) { SimpleHdGraph::Renderer::PlantUML::Context.new } - describe '#render' do - describe 'simple' do + describe "#render" do + describe "simple" do before { @nodes = parser.parse(read_example(:simple)) } @@ -19,7 +19,7 @@ } end - describe 'complex' do + describe "complex" do before { @nodes = parser.parse(read_example(:complex)) } @@ -31,7 +31,7 @@ } end - describe 'depends' do + describe "depends" do before { @nodes = parser.parse( [ diff --git a/spec/renderer/plantuml/resource_spec.rb b/spec/renderer/plantuml/resource_spec.rb index 4677903..73be0d8 100644 --- a/spec/renderer/plantuml/resource_spec.rb +++ b/spec/renderer/plantuml/resource_spec.rb @@ -1,4 +1,4 @@ -require 'spec_helper' +require "spec_helper" describe SimpleHdGraph::Renderer::PlantUML::Resource do include ExampleLoader @@ -6,7 +6,7 @@ let(:parser) { SimpleHdGraph::Parser.new } let(:renderer) { SimpleHdGraph::Renderer::PlantUML::Resource.new } - describe '#render' do + describe "#render" do before { @nodes = parser.parse(read_example(:simple)) } diff --git a/spec/resource_spec.rb b/spec/resource_spec.rb index 8a49173..ae61ac8 100644 --- a/spec/resource_spec.rb +++ b/spec/resource_spec.rb @@ -1,4 +1,4 @@ -require 'spec_helper' +require "spec_helper" describe SimpleHdGraph::ResourceNode do include ExampleLoader @@ -7,18 +7,18 @@ # @return [Hash] def testing_context - YAML.load(< 'Heroku', - 'runtime' => 'Ruby 2.5' + "hosting" => "Heroku", + "runtime" => "Ruby 2.5" } } end end - describe '#has' do + describe "#has" do it { nodes = parser.parse(read_example(:complex)) assert { - nodes.first.resources.first.has == ['admin', 'storage'] + nodes.first.resources.first.has == ["admin", "storage"] } } end diff --git a/spec/simple-hd-graph_spec.rb b/spec/simple-hd-graph_spec.rb index c8ac1c1..5f3772d 100644 --- a/spec/simple-hd-graph_spec.rb +++ b/spec/simple-hd-graph_spec.rb @@ -1,7 +1,7 @@ require "spec_helper" describe SimpleHdGraph do - it 'just dummy for spec style and power-assert' do + it "just dummy for spec style and power-assert" do assert { SimpleHdGraph } diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 8df6690..c9d6432 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -7,8 +7,8 @@ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new -Dir.glob(__dir__ + '/support/**/*.rb').select {|f| +Dir.glob(__dir__ + "/support/**/*.rb").select { |f| f !~ /_(spec|test)\.rb/ -}.each {|f| +}.each { |f| require f } diff --git a/spec/support/example_loader.rb b/spec/support/example_loader.rb index a2db453..71cd24a 100644 --- a/spec/support/example_loader.rb +++ b/spec/support/example_loader.rb @@ -7,11 +7,11 @@ class ExampleNotFound < StandardError; end # def read_example(name) examples = Dir.glob(__dir__ + "/example_#{name}.{yml,yaml}") - + if examples.size > 0 File.read(examples.first) else raise ExampleNotFound.new name - end + end end end