marmerdo 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8ce6cbcddd18a42bee1e2598c90df0afbf96e778d02339dfdd78673d38dc8089
4
- data.tar.gz: 4d28c78b6f3795cf1d04f66d5d6f0087fb09a8597eab09fffbbffc6988d95c90
3
+ metadata.gz: 69476fe32f74a4b4a7081f5bf65ce187026b8e3afa257ad7b0c5b3622153bba4
4
+ data.tar.gz: 7a0c231bdd97fb8a7c68e003d618421b8b5839ddce6cd8672e1f895478f0dd74
5
5
  SHA512:
6
- metadata.gz: 10f9f7c3c329f97182f170708280b48751114cb2c041b6b9ad0051618e15aa0c6c83b505b7365254536b97ee4d6c097978dfa8a759fa756d377ab62f7b44cca8
7
- data.tar.gz: 956553af5976166cec1c91f5dd862d6b5e9b6c379f9b38d9e5b14e50acbd1e02af214a6c74c5ca3e109b4522683d24136be56a2bf184cace2a518479789fb53d
6
+ metadata.gz: '08cb33a93c568b1e799aed8824a371d5716b521a6e8437727a304f59f1b806a1b6d56a7bef96cee1d6344fe8558b0db6fc86a5dd7fc002ce764ea54e48b5f9e9'
7
+ data.tar.gz: 24c9314b548c06974be900afbc46d0e7ab2a98c9a01b36dd936fddff2a676c87f64da9e80a0a87d1a98a153973b504a9bf98fb74eb1374f1dfc49da7c4550aae
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## [0.2.1] - 2023-12-20
2
+
3
+ - 複数の関連先をサポート。
4
+
5
+ ## [0.2.0] - 2023-12-20
6
+
7
+ - 警告コメントを追加。
8
+ - Markdowサポートを追加。
9
+ - classにMarkdownファイルへのリンクを追加。
10
+
1
11
  ## [0.1.0] - 2023-12-18
2
12
 
3
- 最低限の機能を備えた初期リリース。
13
+ - 最低限の機能を備えた初期リリース。
data/lib/marmerdo/cli.rb CHANGED
@@ -2,25 +2,32 @@ require "thor"
2
2
  require_relative "error"
3
3
  require_relative "markdown_parser"
4
4
  require_relative "domain_diagram_generator"
5
+ require_relative "output_generator"
5
6
 
6
7
  module Marmerdo
7
8
  class Cli < Thor
8
9
  class ArgumentError < Error; end
9
10
 
10
- desc "generate SOURCE_GLOB OUTPUT", "Generate a mermaid diagram from markdown files"
11
- def generate(source_glob, output)
12
- raise ArgumentError, "You must provide a source glob and an output file" if source_glob.nil? || output.nil?
11
+ desc "generate SOURCE_GLOB OUTPUT_PATH", "Generate a mermaid diagram from markdown files"
12
+ def generate(source_glob, output_path)
13
+ raise ArgumentError, "You must provide a source glob and an output file" if source_glob.nil? || output_path.nil?
13
14
 
14
15
  nodes = Dir[source_glob].map do |source_path|
15
- puts "Parsing #{source_path}"
16
- name = File.basename(source_path, ".*")
17
16
  content = File.read(source_path)
18
- Marmerdo::MarkdownParser.new(name, content).parse
17
+ node = Marmerdo::MarkdownParser.new(source_path, content).parse
18
+
19
+ puts "Loaded #{node.name}." if node
20
+
21
+ node
19
22
  end.compact
20
23
 
21
- puts "Writing diagram to #{output}"
22
- mermaid = Marmerdo::DomainDiagramGenerator.new(nodes).generate
23
- File.write(output, mermaid)
24
+ puts "Writing domain diagram to #{output_path}."
25
+
26
+ domain_diagram = Marmerdo::DomainDiagramGenerator.new(output_path: output_path, nodes: nodes).generate
27
+ output_content = OutputGenerator.new(output_path, domain_diagram).generate
28
+ File.write(output_path, output_content)
29
+
30
+ puts "Done!"
24
31
  end
25
32
  end
26
33
  end
@@ -1,22 +1,25 @@
1
1
  module Marmerdo
2
2
  class DomainDiagramGenerator
3
- def initialize(nodes)
3
+ def initialize(output_path:, nodes:)
4
+ @output_path = output_path
4
5
  @nodes = nodes
5
6
  end
6
7
 
7
8
  # @return [String] mermaid class diagram
8
9
  def generate
9
10
  classes = @nodes.map(&:to_mermaid_line)
11
+ links = @nodes.map { |node| node.generate_mermaid_link(@output_path) }
10
12
 
11
13
  relationships = @nodes.flat_map do |node|
12
14
  node.relationships.map do |relationship|
13
- relationship.to_mermaid_line(node.name)
15
+ relationship.to_mermaid_str(node.name)
14
16
  end
15
17
  end
16
18
 
17
19
  [
18
20
  "classDiagram",
19
21
  classes,
22
+ links,
20
23
  relationships
21
24
  ].flatten.join("\n")
22
25
  end
@@ -4,8 +4,8 @@ require_relative "relationship"
4
4
 
5
5
  module Marmerdo
6
6
  class MarkdownParser
7
- def initialize(name, content)
8
- @name = name
7
+ def initialize(path, content)
8
+ @path = path
9
9
  @content = content
10
10
  end
11
11
 
@@ -14,8 +14,8 @@ module Marmerdo
14
14
  return nil unless marmerdo_file?
15
15
 
16
16
  Node.new(
17
- name: marmerdo_matter["name"] || @name,
18
- namespace: marmerdo_matter["namespace"],
17
+ path: @path,
18
+ name: marmerdo_matter["name"] || File.basename(@path, ".*"),
19
19
  relationships: relationships
20
20
  )
21
21
  end
data/lib/marmerdo/node.rb CHANGED
@@ -1,19 +1,27 @@
1
+ require "pathname"
2
+
1
3
  module Marmerdo
2
4
  class Node
3
- # @return [Symbol, nil]
5
+ # @return [Symbol]
6
+ attr_reader :path
7
+ # @return [Symbol]
4
8
  attr_reader :name
5
- # @return [Symbol, nil]
6
- attr_reader :namespace
7
9
  attr_accessor :relationships
8
10
 
9
- def initialize(name:, namespace:, relationships:)
10
- @name = name&.to_sym
11
- @namespace = namespace&.to_sym
11
+ def initialize(path:, name:, relationships:)
12
+ @path = path
13
+ @name = name.to_sym
12
14
  @relationships = relationships
13
15
  end
14
16
 
15
17
  def to_mermaid_line
16
18
  "class #{name}"
17
19
  end
20
+
21
+ def generate_mermaid_link(output_path)
22
+ output_dir = Pathname.new(output_path).dirname
23
+ relative_path = Pathname.new(path).relative_path_from(output_dir).to_s
24
+ "link #{name} \"#{relative_path}\""
25
+ end
18
26
  end
19
27
  end
@@ -0,0 +1,56 @@
1
+ require_relative "error"
2
+
3
+ module Marmerdo
4
+ # This class generates a markdown or mermaid file from a mermaid diagram.
5
+ class OutputGenerator
6
+ WARNING_COMMENT = "This file was generated by Marmerdo. Do not edit it manually.".freeze
7
+
8
+ class UnknownOutputExtensionError < Error
9
+ def initialize(output_extension)
10
+ super("Unknown output extension #{output_extension}.\nSupported filetypes are markdown and mermaid.")
11
+ end
12
+ end
13
+
14
+ def initialize(output_path, domain_diagram)
15
+ @output_path = output_path
16
+ @domain_diagram = domain_diagram
17
+ end
18
+
19
+ # @return [String]
20
+ def generate
21
+ case output_filetype
22
+ when :markdown
23
+ [
24
+ "<!-- #{WARNING_COMMENT} -->",
25
+ "",
26
+ "```mermaid",
27
+ @domain_diagram,
28
+ "```"
29
+ ].join("\n")
30
+ when :mermaid
31
+ [
32
+ "%% #{WARNING_COMMENT}",
33
+ "",
34
+ @domain_diagram
35
+ ].join("\n")
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def output_extension
42
+ File.extname(@output_path)
43
+ end
44
+
45
+ def output_filetype
46
+ case output_extension
47
+ when ".markdown", ".md"
48
+ :markdown
49
+ when ".mermaid", ".mmd"
50
+ :mermaid
51
+ else
52
+ raise UnknownOutputExtensionError, output_extension
53
+ end
54
+ end
55
+ end
56
+ end
@@ -19,7 +19,7 @@ module Marmerdo
19
19
  # @return [Symbol]
20
20
  attr_reader :type
21
21
 
22
- # @return [Symbol]
22
+ # @return [Array<Symbol>]
23
23
  attr_reader :to
24
24
 
25
25
  def self.valid_type?(type)
@@ -28,30 +28,36 @@ module Marmerdo
28
28
 
29
29
  def initialize(type:, to:)
30
30
  @type = type.to_sym
31
- @to = to.to_sym
31
+ @to = if to.is_a?(Array)
32
+ to.map(&:to_sym)
33
+ else
34
+ [to.to_sym]
35
+ end
32
36
  end
33
37
 
34
- def to_mermaid_line(from)
35
- case type
36
- when :inheritance
37
- "#{to} <|-- #{from}"
38
- when :composition
39
- "#{to} *-- #{from}"
40
- when :aggregation
41
- "#{to} o-- #{from}"
42
- when :association
43
- "#{from} --> #{to}"
44
- when :link_solid
45
- "#{from} -- #{to}"
46
- when :dependency
47
- "#{from} ..> #{to}"
48
- when :realization
49
- "#{from} ..|> #{to}"
50
- when :link_dashed
51
- "#{from} .. #{to}"
52
- else
53
- raise UnknownRelationshipType
54
- end
38
+ def to_mermaid_str(from)
39
+ to.map do |t|
40
+ case type
41
+ when :inheritance
42
+ "#{t} <|-- #{from}"
43
+ when :composition
44
+ "#{t} *-- #{from}"
45
+ when :aggregation
46
+ "#{t} o-- #{from}"
47
+ when :association
48
+ "#{from} --> #{t}"
49
+ when :link_solid
50
+ "#{from} -- #{t}"
51
+ when :dependency
52
+ "#{from} ..> #{t}"
53
+ when :realization
54
+ "#{from} ..|> #{t}"
55
+ when :link_dashed
56
+ "#{from} .. #{t}"
57
+ else
58
+ raise UnknownRelationshipType
59
+ end
60
+ end.join("\n")
55
61
  end
56
62
  end
57
63
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Marmerdo
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.1"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marmerdo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - sijiaoh
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-12-17 00:00:00.000000000 Z
11
+ date: 2023-12-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: front_matter_parser
@@ -61,6 +61,7 @@ files:
61
61
  - lib/marmerdo/error.rb
62
62
  - lib/marmerdo/markdown_parser.rb
63
63
  - lib/marmerdo/node.rb
64
+ - lib/marmerdo/output_generator.rb
64
65
  - lib/marmerdo/relationship.rb
65
66
  - lib/marmerdo/version.rb
66
67
  - marmerdo.gemspec